帅气的属性动画赏析(Property Animation)

本文详细介绍了Android中的动画分类及其实现方式,重点讲解了PropertyAnimation的多种使用方法,包括ObjectAnimator、ValueAnimator的应用实例,并展示了如何监听动画事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

权利声明:转载请注明出处http://blog.youkuaiyun.com/hello_chillax/article/details/44992787

今天我们来学习Android中的一个比较好玩的动画效果:Property Animation、でわ、はじめましょう。

一,初めに:动画的分类
Android动画分类:View Animation,Drawable Animation,Property Animation。

各自能实现的效果:View Animation比较简单,能且只能实现View的基本动画效果,如translation(移动),alpha(淡入淡出),rotate(旋转),scale(缩放)。如果你想实现其他的特效的话,就应该考虑使用Property Animation了。

二、次に:Property Animation的简单使用。

1.ObjectAnimator.

.提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。
下面我们通过一个Demo来细致地讲一下ObjectAnimator。
首先我们新建一个工程,在main.xml中写一个Button。在main函数中写下如下代码

我们实现这样一个动画:点击Button,让Button向右下角移动一段距离:于是我们有一下四种实现方法。

//实现方法一:animation动画只是有了动画效果,控件本身的位置并未移动
        TranslateAnimation animationX=new TranslateAnimation(0, 500, 0, 0);
        TranslateAnimation animationY=new TranslateAnimation(0,0,0,500);
        AnimationSet set=new AnimationSet(false);
        set.addAnimation(animationX);
        set.addAnimation(animationY);
        set.setDuration(3000);
        set.setFillAfter(true);
        button.startAnimation(set);
//实现方法二:   这种方法实际上已经改变了控件的位置!!!
        ObjectAnimator.ofFloat(button, "translationX", 0F,500F).setDuration(3000).start();
        ObjectAnimator.ofFloat(button, "translationY", 0F,500F).setDuration(3000).start();
//第三种实现方法: 用PropertyValuesHolder实现动画(比 方法二效率更高)
        PropertyValuesHolder holder1=PropertyValuesHolder.ofFloat("translationX", 0,500);
        PropertyValuesHolder holder2=PropertyValuesHolder.ofFloat("translationY", 0,500);
        ObjectAnimator.ofPropertyValuesHolder(button, holder1,holder2).setDuration(3000).start();
//第四种实现方法:用AnimatorSet实现动画效果,自定义动画执行顺序
        ObjectAnimator animator1=ObjectAnimator.ofFloat(button, "translationX", 0F,500F);
        ObjectAnimator animator2=ObjectAnimator.ofFloat(button, "translationY", 0F,500F);
        AnimatorSet set=new AnimatorSet();
        set.playTogether(animator1,animator2);//同时播放
//      set.playSequentially(animator1,animator2);//顺序播放
//      set.play(animator1).with(animator2);//同时播放
//      set.play(animator2).after(animator1);//让animator2在animator1后面播放
        set.setDuration(3000);
        set.start();

怎么样,我们不仅实现了动画,而且用简短的代码实现了四种方式。

下面我们来看一下对动画事件的监听:
我们让Button移动结束后调用一个Toast,show出“animator over”的 字样.
我们选用方法4来添加监听效果,其他的类似:
添加如下代码:

set.addListener(new AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                Toast.makeText(MainActivity.this, "animator over", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }
        });

当然,如果你感觉这个监听器代码太多,不想实现那么多的方法,你可以用下面这个方法:

set.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
            Toast.makeText(MainActivity.this, "animator over", Toast.LENGTH_SHORT).show();
            }
        });

是不是简洁多了。。

2.ValueAnimator
下面我们来进入另一个重要的animator。首先,让我们先看一下它和ObjectAnimator的关系:

public final class ObjectAnimator extends ValueAnimator {
    private static final boolean DBG = false;

    // The target object on which the property exists, set in the constructor
   。。。。。。。

显然,ObjectAnimator继承自ValueAnimator,即,ObjectAnimator包装了ValueAnimator;

注意:ValueAnimator本身并不能实现任何动画,它其实是一个产生动画变化的变化值,
下面我们来实现一个功能:让button的text从0随着动画的进度增加到100的效果:添加如下代码:

ValueAnimator animator=ValueAnimator.ofInt(0,100);
        animator.setDuration(3000);
        animator.addUpdateListener(new AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer integer=(Integer) animation.getAnimatedValue();
                button.setText(""+integer);
            }
        });
        animator.start();

ok,就这样了

3.Layout Animation
过渡的类型一共有四种:

LayoutTransition.APPEARING 当一个View在ViewGroup中出现时,对此View设置的动画

LayoutTransition.CHANGE_APPEARING 当一个View在ViewGroup中出现时,对此View对其他View位置造成影响,对其他View设置的动画

LayoutTransition.DISAPPEARING 当一个View在ViewGroup中消失时,对此View设置的动画

LayoutTransition.CHANGE_DISAPPEARING 当一个View在ViewGroup中消失时,对此View对其他View位置造成影响,对其他View设置的动画

LayoutTransition.CHANGE 不是由于View出现或消失造成对其他View位置造成影响,然后对其他View设置的动画。

注意动画到底设置在谁身上,此View还是其他View。

最后,Demo下载地址:http://download.youkuaiyun.com/detail/nsgsbs/8525995

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值