关于平滑的两点
1) 使用浮点类型而不是 int 的动画器,因为我认为 Update 调用的时间不能保证精确到毫秒,因此您强制它截断该值,因为该值实际上是使用分数计算的(float) 持续时间的 0 到 1 之间
例如在一个完美的世界中,从 0 到 20 的时序开始如下:-
- 0ms = 0
- 500ms = 1
- 1000ms = 2
但实际上时序可能开始如下:-
- 0ms = 0
- 499ms = 0.999(转换为 int 时也是 0)
- 1000ms = 2
2) 重新计算线的起点和终点以重新绘制它可能不是最快的,因此也是最平滑的方法。
设置包含线 onAnimationUpdate 的画布的旋转可能更快更顺畅(画布轴点 X 和 Y 设置为表盘中心)
这是因为这很可能是硬件加速转换
例如
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class Drawline extends View {
Paint paint = new Paint();
private void init() {
paint.setColor(Color.BLACK);
}
public Drawline(Context context) {
super(context);
init();
}
public Drawline(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public Drawline(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawLine(100, 100, 150, 150, paint);
}
}
public class MainActivity extends AppCompatActivity {
Drawline drawLine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawLine = new Drawline(this);
drawLine.setPivotX(100f);
drawLine.setPivotY(100f);
setContentView(drawLine);
ValueAnimator animator = ValueAnimator.ofFloat(0f, 20f);
animator.setDuration(10000);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float x = (float) animation.getAnimatedValue();
drawLine.setRotation(x);
drawLine.invalidate();
}
});
animator.start();
}
}