Два момента о плавности
1) Используйте аниматор типа float, не int, так как я не думаю, что время на вызовах Update гарантированно будет с точностью до миллисекунды, поэтому вы заставляете его усекатьзначение как значение фактически вычисляется с использованием дроби (float) от 0 до 1 продолжительности
например. В идеальном мире временная последовательность от 0 до 20 начинается следующим образом: -
- 0 мс = 0
- 500 мс = 1
- 1000 мс = 2
Но в действительности временная последовательность может начинаться так: -
- 0 мс = 0
- 499 мс = 0,999 (при преобразовании в целое также будет 0)
- 1000 мс = 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();
}
}