Android属性动画实战(一)

属性动画,就是通过改变对象的属性产生动画
先看看效果
这里写图片描述

对象的属性有以下几种:

1. Duration动画的持续时间,默认300ms。
2. Time interpolation:时间差值,乍一看不知道是什么,但是我说LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的   了,定义动画的变化率。
3. Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。
4. Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。
5. Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。

操作对象属性的相关的类有:
1. ObjectAnimator 动画的执行类,后面详细介绍
2. ValueAnimator 动画的执行类,后面详细介绍
3. AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
4. AnimatorInflater 用户加载属性动画的xml文件
5. TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
6. TimeInterpolator 时间插值,上面已经介绍。

一)ObjectAnimator ,这个比较简单,但是有几点必须条件:
1,有对象
2,对象有get…() set…( )方法

    /**
     * setRotationX() 这是View中的方法
     * Sets the degrees that the view is rotated around the horizontal axis through the pivot point
     * 意思是让View沿着水平防线旋转
     * <p/>
     * 动画更新中,会不断的调用setRotationX()这个方法,所以必须得有setRotationX() 和getRotationX()方法
     */
    private void tranXz() {
        ObjectAnimator animal = ObjectAnimator
                .ofFloat(ivIcon, "rotationX", 0.0f, 360.f)
                .setDuration(300);
        animal.start();
    }
    /**
     * 随便设置一个方法jh,虽然看不出来有任何动画,但是确实有动画值了500毫秒
     * addUpdateListener这个是监听动画执行的过程
     * <p/>
     * animatedValue 这个值是从1到0不断的不规律缩减的
     * 04-12 23:02:38.773 14675-14675/com.animationexample I/System.out: value====1.0
     * 04-12 23:02:38.790 14675-14675/com.animationexample I/System.out: value====0.9971504
     * 04-12 23:02:38.808 14675-14675/com.animationexample I/System.out: value====0.9892905
     * .............
     * 04-12 23:02:39.198 14675-14675/com.animationexample I/System.out: value====0.06646466
     * 04-12 23:02:39.224 14675-14675/com.animationexample I/System.out: value====0.02447176
     * 04-12 23:02:39.252 14675-14675/com.animationexample I/System.out: value====0.010709524
     * 04-12 23:02:39.282 14675-14675/com.animationexample I/System.out: value====0.0
     */
    private void tansDrop() {
        ObjectAnimator dropAnimal = ObjectAnimator
                .ofFloat(ivIcon, "jh", 1.0f, 0.0f)
                .setDuration(500);
        dropAnimal.start();

        dropAnimal.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();
//                System.out.println("value====" + value);
//              淡出并且缩小
                ivIcon.setAlpha(value);
                ivIcon.setScaleX(value);
                ivIcon.setScaleY(value);
            }
        });
    }

二)ValueAnimator 它只需要设定好初始值和结束值,然后在监听中对对象进行操作就ok了

    /**
     * 第一种方法:直接操作属性设置View的translationY属性
     * 第二种方法:是自己通过监听来改变View的属性,更加灵活
     */
    private void tansBelow() {
/*        ObjectAnimator dropAnimal = ObjectAnimator
                .ofFloat(ivIcon2, "translationY", 0, StringUtil.getScreenHeight() - ivIcon2.getHeight())
                .setDuration(500);
        dropAnimal.start();*/

        //
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, StringUtil.getScreenHeight() - ivIcon2.getHeight())
                .setDuration(500);
        valueAnimator.start();
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                ivIcon2.setTranslationY((Float) animation.getAnimatedValue());
            }
        });
    }
    private void tranShe() {
        //先设置好起点和终点
        PointF startPoint = new PointF(ivIcon3.getX(), ivIcon3.getY());
        PointF endPoint = new PointF(ivIcon3.getX()-300,ivIcon3.getY()-300);
        ValueAnimator sheAnimator = ValueAnimator.ofObject(new MyPointEvaluator(), startPoint, endPoint);
        sheAnimator.setDuration(500);
        sheAnimator.start();
        sheAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                PointF pontf = (PointF) animation.getAnimatedValue();
                System.out.println(pontf.x);
                ivIcon3.setX(pontf.x);
                ivIcon3.setY(pontf.y);
            }
        });
    }

    //Evaluator动态设置属性值
    public class MyPointEvaluator implements TypeEvaluator<PointF> {
        @Override // 实现TypeEvaluator接口的evaluate()方式,fraction是动画的进度,从0.0到1.0,根据进度,初始值和最终值,给出动画过程的中间值。
        public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
            PointF point = new PointF();
            point.x = startValue.x + fraction * (endValue.x - startValue.x);
            point.y = startValue.y + fraction * (endValue.y - startValue.y);
            return point;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值