Java 围绕中心点旋转一条线

Java 围绕中心点旋转一条线,java,android,android-studio,geometry,Java,Android,Android Studio,Geometry,我目前正在做一个有计时器的游戏 随着时间的推移,红线应该围绕其中心点旋转,当时间结束时,红线在另一侧结束。我现在让线旋转,它始终保持相同的长度,但它偶尔移动,动画不平滑。我不完全确定我做错了什么 startX和Y是直线的起点和终点,endX和Y是直线在250 psi时的终点 1) 使用float类型而不是int的动画师,因为我认为更新调用的时间不能保证精确到毫秒,因此您强制它截断该值,因为该值实际上是使用持续时间的0到1之间的分数(float)计算的 e、 g.在一个完美的世界中,0到20的计时

我目前正在做一个有计时器的游戏

随着时间的推移,红线应该围绕其中心点旋转,当时间结束时,红线在另一侧结束。我现在让线旋转,它始终保持相同的长度,但它偶尔移动,动画不平滑。我不完全确定我做错了什么


startX和Y是直线的起点和终点,endX和Y是直线在250 psi时的终点

1) 使用float类型而不是int的动画师,因为我认为更新调用的时间不能保证精确到毫秒,因此您强制它截断该值,因为该值实际上是使用持续时间的0到1之间的分数(float)计算的

e、 g.在一个完美的世界中,0到20的计时顺序开始如下:-

  • 0ms=0
  • 500ms=1
  • 1000ms=2
但事实上,时间顺序可能是这样开始的:-

  • 0ms=0
  • 499ms=0.999(转换为整数时也将为0)
  • 1000ms=2
2) 重新计算直线的起点和终点以重新绘制它可能不是最快的方法,因此也是最平滑的方法

设置画布的旋转(画布轴点X和Y设置为刻度盘的中心)可能更快、更平滑,因为该画布包含NimationUpdate上的线

这是因为这很可能是硬件加速的转换

e、 g

导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.util.AttributeSet;
导入android.view.view;
公共类抽绳扩展视图{
油漆=新油漆();
私有void init(){
油漆。设置颜色(颜色。黑色);
}
公共抽绳(上下文){
超级(上下文);
init();
}
公共绘制线(上下文、属性集属性){
超级(上下文,attrs);
init();
}
公共绘制线(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
init();
}
@凌驾
公共空白onDraw(画布){
帆布.抽绳(100150150,油漆);
}
}
public类MainActivity扩展了AppCompatActivity{
抽绳抽绳;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
抽绳=新抽绳(本);
抽绳。设置枢轴X(100f);
抽绳。设置枢轴(100f);
setContentView(抽绳);
ValueAnimator animator=ValueAnimator.offload(0f,20f);
设置持续时间(10000);
setInterpolator(新的LinearInterpolator());
animator.addUpdateListener(新值animator.AnimatorUpdateListener(){
@凌驾
动画更新上的公共无效(ValueAnimator动画){
float x=(float)animation.getAnimatedValue();
抽绳。设置旋转(x);
drawLine.invalidate();
}
});
animator.start();
}
}

您还使用了整数,因此指针只能在20个离散位置中的一个位置上使用。请改用
浮点
。数学触发函数的参数是弧度,而不是度;你把针移动得太快了,而且它正在缠绕。试试看,
ValueAnimator.offload(Math.toRadians(-120),Math.toRadians(120))取而代之,不要加-80。@greeble31非常感谢!这至少修复了它的动画方面。