пользовательский компонент - манипулировать анимацией холста или использовать что-то другое - PullRequest
0 голосов
/ 05 августа 2011

Я хочу разработать свое приложение с простой анимацией. Я использовал много источников из: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.html

Мой код:

 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 static final float SWEEP_INC = 1;

    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);
    }

    @Override
    protected void onDraw(Canvas canvas) {          
        drawArcs(canvas, bigOval, true, myPaint);           
        myStart = -90;          
        mySweep -= SWEEP_INC;
        invalidate();
    }       
}}

Я использую свое представление таким образом в моем XML-файле:

<view
class="go.android.Animation$AnimView"
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
/>

Работает нормально. Я знаю, что это не пользовательская анимация. Но возможно ли установить скорость этой анимации (в мс или секундах)? Или остановить эту анимацию (например, в OnClick или OnTouch Listener) и узнать, когда эта анимация закончилась?

Я тоже хочу получить первый целый круг, а в конце анимации - отсутствие круга. Просто изменить направление этой анимации. Это возможно?

Я не хочу использовать покадровую анимацию. Я хочу получить непрерывную анимацию. Есть ли возможность получить похожую анимацию (с настройкой скорости и т.д ...) Я также хочу анимировать не только цвет, но и круглую рисовку.

Заранее спасибо. Извините за мой английский.

1 Ответ

0 голосов
/ 05 августа 2011

Возможно, есть более лучшие и более точные способы управления анимацией, чем этот (вы могли бы изучить использование 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.Так что я не знаю способа назначить продолжительность в секундах для этой анимации.Для этого вы можете захотеть взглянуть на более сложные методы анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...