Android_属性动画

2019-10-30  本文已影响0人  书虫大王X

属性动画的优势:
相比于补间动画和帧动画,属性动画更加强大,而且解决了两种的一些缺陷,比如:补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性,举个例子:
在屏幕的左上角添加一个按键,用补间动画将其移到右下角后,对按键进行点击,按键没有反应,但是对按键在左上角原来的位置点击,按键有反应。

1.ValueAnimator:

属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。ValueAnimator的作用是对值进行计算,所以调用ValueAnimator执行动画,我们只需要告诉它要操作的数据的起始值、结束值和值过度所需时间。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,例:

 public class wll extends View {

    /**
     * 实现的功能:饼状图
     */
    Path path;
    int angle = 5;

    public wll(Context context) {
        this(context,null);
    }

    public wll(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);


//        用属性动画实现该动画
//        设置动画的范围
        final ValueAnimator va = ValueAnimator.ofInt(0,360);
        va.setDuration(2000);
        va.setRepeatCount(ValueAnimator.INFINITE);
        va.setRepeatMode(ValueAnimator.REVERSE);
//        监听属性的值
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
//                获取动画执行过程中的属性值
                angle = (int)valueAnimator.getAnimatedValue();
                invalidate();
            }
        });
//        启动动画
        va.start();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawPieChart(canvas,Color.BLACK,(float)(angle/360.0));
    }

    private void drawPieChart(Canvas canvas,int color,float rate){
        path = new Path();
        Paint paint = new Paint ();
        paint.setAntiAlias(true);//抗锯齿
        paint.setColor(color);
//        设置填充模式
        paint.setStyle(Paint.Style.FILL);
//        画圆
        canvas.drawArc(50,100,350,400,0,360*rate,true,paint);
    }
}
效果图
2.ObjectAnimator:

ValueAnimator是对一个数值进行过度的动画,但是ObjectAnimator就不同了,它可以直接对任意对象的任意属性进行动画操作。我们用的比较多的也是ObjectAnimator,但是ObjectAnimator还是继承于ValueAnimator的,关于
ObjectAnimator的用法,举个例子:

public class rotatePicture extends RelativeLayout {

    ImageView out;
    public rotatePicture(Context context) {
        this(context,null);
    }
    public rotatePicture(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    private void init() {
        ImageView liner = new ImageView(getContext());
        liner.setImageResource(R.drawable.a);
        addView(liner);

        out = new ImageView(getContext());
        out.setImageResource(R.drawable.b);
        addView(out);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
//       ObjectAnimator实现
        ObjectAnimator oa = ObjectAnimator.ofFloat(out,
                "rotation",0,360);
        oa.setDuration(1000);
        oa.setRepeatMode(ObjectAnimator.RESTART);
        oa.setRepeatCount(ObjectAnimator.INFINITE);
        oa.setInterpolator(new LinearInterpolator());
        oa.start();
        
    }
}

效果图
3.组合动画:

组合动画用到点的主要是AnimatorSet这个类,它为我们提供了一些方法:


ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
上一篇 下一篇

猜你喜欢

热点阅读