Возможно, есть более лучшие и более точные способы управления анимацией, чем этот (вы могли бы изучить использование OpenGL), но вы можете относительно легко изменить скорость и направление анимации, учитывая ваш существующий код.
Скорость контролируется полем SWEEP_INC
(которое, я бы догадался, означает «Увеличение развертки»).Каждый раз, когда вызывается метод onDraw()
, он увеличивает размер клина на 1 градус.Если вы хотите, чтобы анимация шла в 5 раз быстрее, установите SWEEP_INC
на 5 вместо 1. Если вы хотите, чтобы анимация шла вдвое быстрее, установите SWEEP_INC
на 0,5.
Вы также можете простоустановите флаг, чтобы обратить анимацию каждый раз, когда она заканчивается.Я модифицировал ваш код так, чтобы он обращался каждый раз, когда он достигает конца, используя логическое значение addToCircle
.
public class Animation extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
private static class AnimView extends View {
private Paint myPaint;
private Paint myFramePaint;
private RectF bigOval;
private float myStart;
private float mySweep;
private float SWEEP_INC = 1;
//Use this flag to control the direction of the arc's movement
private boolean addToCircle = true;
public AnimView(Context context) {
super(context);
init();
}
public AnimView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
myPaint = new Paint();
myPaint.setAntiAlias(true);
myPaint.setStyle(Paint.Style.FILL);
myPaint.setColor(Color.RED);
bigOval = new RectF(40, 10, 280, 250);
myFramePaint = new Paint();
myFramePaint.setAntiAlias(true);
myFramePaint.setColor(Color.BLACK);
}
private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint) {
canvas.drawRect(oval, myFramePaint);
canvas.drawArc(oval, myStart, mySweep, useCenter, paint);
}
public void setIncrement(float newIncrement)
{
SWEEP_INC = newIncrement;
}
@Override
protected void onDraw(Canvas canvas) {
drawArcs(canvas, bigOval, true, myPaint);
myStart = -90;
//If the arc is currently getting bigger, decrease the value of mySweep
if(addToCircle)
{
mySweep -= SWEEP_INC;
}
//If the arc is currently getting smaller, increase the value of mySweep
else
{
mySweep += SWEEP_INC;
}
//If the animation has reached the end, reverse it
if(mySweep%360 == 0)
{
addToCircle = !addToCircle;
}
invalidate();
}
}
}
EDIT Если вы удалите модификаторы final
и static
с SWEEP_INC
вы можете изменить скорость анимации во время выполнения, используя добавленную мной функцию setIncrement(float newIncrement)
.
Вы можете остановить анимацию, вызвав setIncrement(0)
.
Однако,Я не думаю, что есть постоянная скорость, с которой вызывается onDraw.Так что я не знаю способа назначить продолжительность в секундах для этой анимации.Для этого вы можете захотеть взглянуть на более сложные методы анимации.