自定义组件 - 操纵画布动画或使用其他东西

时间:2011-08-05 18:27:32

标签: android animation view canvas

我想用简单的动画开发我的应用程序。我使用了很多来源: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" 
/>

它运作正常。我知道这不是自定义动画。但是这可以设置这个动画的速度(以ms或秒为单位)?或者停止此动画(例如在OnClick或OnTouch侦听器中),并了解此动画何时完成?

我也希望得到第一个整圈,并在动画结束时 - 缺少圆圈。只需改变这个动画的方向。这可能吗?

我不想使用逐帧动画。我想要连续动画。有没有可能获得类似的动画(设置速度等...) 我还想要制作一种颜色的动画,而不是一个圆形的绘画。

提前谢谢你。对不起我的英语技能。

1 个答案:

答案 0 :(得分:0)

可能有更好更精确的方法来控制你的动画(你可以考虑使用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();
        }       
    }
}

修改 如果您从final中删除staticSWEEP_INC修饰符,则可以使用我添加的setIncrement(float newIncrement)函数在运行时更改动画的速度。

您可以致电setIncrement(0)停止动画。

但是,我不认为调用onDraw的速率是恒定的。所以我不知道如何为这个动画分配持续时间(以秒为单位)。为此,您可能希望研究更复杂的动画方法。