安卓动画

 

补间动画(Tween Animation)

a. 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)。

b. 只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应。

c. 组合使用步骤较复杂。

d. View Animation 也是指此动画。

 

帧动画(Frame Animation)

a. 用于生成连续的Gif效果图。

b.DrawableAnimation也是指此动画。

 

属性动画(Property Animation)

a. 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())。

b. 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。

c. Android3.0 (API11)及以后出现的功能,3.0之前的版本可使用github第三方开源库nineoldandroids.jar进行支持。

 

 

常用API

ObjectAnimator :对象动画执行类。

PropertyValuesHolder: 属性存储器,为两个执行类提供更新多个属性的功能。

AnimatorListener :动画执行监听,在动画开始、重复、结束、取消时进行回调。

Keyframe :为PropertyValuesHolder提供多个关键帧的操作值。

AnimatorSet :一组动画的执行集合类:设置执行的先后顺序,时间等。

TimeInterpolator :时间插值,用于控制动画执行过程。

ValueAnimator :值动画执行类,常配合AnimatorUpdateListener使用。

AnimatorUpdateListener:动画更新监听。

TypeEvaluator :类型估值,用于设置复杂的动画操作属性的值。

 

 

 

1)translationX 和translationY:这两个属性控制了View所处的位置,它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。
2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
5)x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。

 

 

//代码案列

/**
 * 属性动画
 * 优点 :
 * 1 不在局限于view 对象 ,无对象也看进行动画处理
 * 2 不在局限于4种基本变换 平移 旋转 缩放 透明度
 * 3可以灵活的操作任意对象属性,根据 自己业务来实现自己想要的结果
 * <p>
 * 核心
 * 1.ObjectAnimation 对象动画
 * 2.ValueAnimation 值动画
 * 3.PropertyValueHolder 多用于多个动画执行
 * 4.TypeEvaluator 估值器
 * 5.Interpolator 插值器
 * 6.AnimationSet 动画集合
 * <p>
 * <p>
 * <p>
 * 原理改变view属性值 -->注册同步信号--》系统每16ms发送一个同步信号--》接受到同步信号 移除上个属性值 注册新的属性值 垂直同步信号
 */
public class Animation3Activity extends AppCompatActivity {

    private ImageView iv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_3);

        iv = (ImageView) findViewById(R.id.iv);
        final Button btn1 = (Button) findViewById(R.id.btn1);
        final Button btn2 = (Button) findViewById(R.id.btn2);
        final Button btn3 = (Button) findViewById(R.id.btn3);
        final Button btn4 = (Button) findViewById(R.id.btn4);
        final Button btn5 = (Button) findViewById(R.id.btn5);
        final Button btn6 = (Button) findViewById(R.id.btn6);
        final Button btn7 = (Button) findViewById(R.id.btn7);
        //使用objectAnimation 实现动画
        objectAnimation(btn1, btn2, btn3, btn4, btn5, btn7);

        //使用监听手动 实现动画
        btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "test", 0f, 1f, 0.5f, 1f);
                //监听手动设置动画
                objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        //手动设属  动画性值
                        float value = (float) animation.getAnimatedValue();
                        iv.setAlpha(value);
                    }
                });
                //设置时间
                objectAnimator.setDuration(500);
                //开始动画
                objectAnimator.start();


            }
        });


    }

    private void objectAnimation(Button btn1, Button btn2, Button btn3, Button btn4, Button btn5, Button btn7) {
        /**
         *
         * ObjectAnimation是ValueAnimation的子类
         * 参数 (需要执行动画的view对象,动画名称,动画值)
         * 、、
         * 注意动画名称: 透明度动画(alpha) 旋转动画(rotation) 缩放(scale)平移(translate)
         * 注意 如果忘记名称可以通过view.setxx获取对应名称  ,如果输入错误会报红
         * 、、
         * 动画值 :第一个是开始值  最后一个是结束值  中间的是变化到结束值的过渡值
         * 注意 单位float
         *
         */

        //透明度动画
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //1创建属性对象
                ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 1f, 0.2f, 1f);
                //2设置时间
                objectAnimator.setDuration(500);
                //设置动画次数 ObjectAnimator.INFINITE表示无限循环
                objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
                //设置延迟开始动画
                objectAnimator.setStartDelay(100);
                //设置重复播放动画的模式:正序 ValueAnimator.RESTART(默认);倒叙 ValueAnimator.REVERSE
                objectAnimator.setRepeatMode(ValueAnimator.RESTART);

                //3启动动画
                objectAnimator.start();


            }
        });


        //旋转动画
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ObjectAnimator.ofFloat(iv, "rotationX", 0f, 90f, 0f).setDuration(500).start();
            }
        });

        //缩放动画
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ObjectAnimator.ofFloat(iv, "scaleX", 1f, 0.5f, 1f).setDuration(500).start();
                ObjectAnimator.ofFloat(iv, "scaleY", 1f, 0.5f, 1f).setDuration(500).start();
            }
        });


        //平移动画
        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //设置动画到view上 启动动画
                ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "translationX", 0f, 100f, 500f).setDuration(500);

                //设置插值器
                setInterpolator(objectAnimator);
                objectAnimator.start();


            }
        });


        //组合动画
        btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //方法一 几个动画同时执行
//                ObjectAnimator.ofFloat(iv, "translationY", -100f, 100f, 0f).setDuration(500).start();
//                ObjectAnimator.ofFloat(iv, "scaleX", 1f, 0.5f, 1f).setDuration(500).start();
//                ObjectAnimator.ofFloat(iv, "scaleY", 1f, 0.5f, 1f).setDuration(500).start();

                //方法二 动画根据添加先后顺序一个个执行
                ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "translationY", -100f, 100f, 0f).setDuration(500);
                ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(iv, "scaleX", 1f, 0.5f, 1f).setDuration(500);
                ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 0.5f, 1f).setDuration(500);
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.playSequentially(objectAnimator, objectAnimator1, objectAnimator2);
                animatorSet.start();
            }
        });

        //估值器动画
        btn7.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setDuration(3000);


                //设置插值器
                setInterpolator(valueAnimator);

                //设置估值器
                setEvaluator(valueAnimator);

                //启动动画
                valueAnimator.start();


            }
        });
    }

    /**
     * 设置插值器
     */

    private void setInterpolator(ValueAnimator valueAnimator) {
//        //加速插值器 参数越大 起始速度越慢 但是速度越快
//        valueAnimator.setInterpolator(new AccelerateInterpolator(1f));
//        //减速插值器 参数越大 起始速度越快 但是速度越慢
//        valueAnimator.setInterpolator(new DecelerateInterpolator(0.1f));
//        //先加速后减速
//        valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

//        //张力值   参数值越大  初始的偏移越大 而且速度越快
//        valueAnimator.setInterpolator(new AccelerateInterpolator(1f));

//        //张力值
//        valueAnimator.setInterpolator(new OvershootInterpolator(0.5f));
//
//        //张力值   参数值越大  初始和结束时的 偏移越大
//        valueAnimator.setInterpolator(new AnticipateOvershootInterpolator(0.5f));

//        //弹跳插值器
        valueAnimator.setInterpolator(new BounceInterpolator());

//        //周期插值器 2表示动画执行2次
//        valueAnimator.setInterpolator(new CycleInterpolator(2));

//        //线性插值器
//        valueAnimator.setInterpolator(new OvershootInterpolator(0.3f));


    }

    /**
     * 设置估值器
     */
    private void setEvaluator(ValueAnimator valueAnimator) {
        //设置估值对象
        valueAnimator.setObjectValues(new PointF(0, 0));
        final PointF point = new PointF();

        //计算估值指
        valueAnimator.setEvaluator(new TypeEvaluator() {
            @Override
            public Object evaluate(float fraction, Object startValue, Object endValue) {
                point.x = 100f * (fraction * 5);
                //使用重力公式计算Y =vt=1/2*g*t*t
                point.y = 1f * 98f * (fraction * 5) * (fraction * 5);

                return point;
            }
        });

        //监听动画顺序值变化
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                PointF pointF = (PointF) animation.getAnimatedValue();

                iv.setX(pointF.x);
                iv.setY(pointF.y);
            }
        });
    }

}

 

//源码地址 https://github.com/zhudaihao/animation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值