浅析 - Android三种动画

尊重每个人的付出,转载请点这里:http://blog.csdn.net/hanj456/article/details/52625351

Android中动画基本分为三种形式:

  1. 帧动画(Frame Animation)
  2. 补间动画(Tween Animation)
  3. 属性动画(Property Animation)

下面进入“三问三答”环节:

问:帧动画,补间动画和属性动画 怎么理解?
答:最简单的方式是从字面上去理解:我们知道动画剪辑是根据“帧”来算的,每一帧就是一张图片,老式的胶片电影就是“帧动画”,通过连续的滚动胶片使人产生错觉,以为是动画,其实就是很多图片连续运动达到的这种效果,Android中的帧动画也是这个原理,要想使用帧动画得准备好相应的图片资源;再来看补间动画,字面上的意思就是填补空缺的动画,其实它就是这么做的,指定一张图片起始状态和最后状态的样子,计算并显示中间需要的样子,这就是补间动画,但要注意的是补间动画仅仅是视觉上的改变,并没有实质的改变属性,举个栗子就是控制一个button从屏幕左边移动到右边,此时点击按钮时没有事件反馈的,因为它其实还在左边,只是视觉上在右边而已,点击左边按钮原来的位置处就能接收到点击事件,这么讲你应该就明白了吧;最后一种动画便是Android 3.0推出的属性动画,字面上就知道和属性相关,这种动画是通过改变图片的属性来达到动画的效果,也就是补间动画的那个栗子上如果使用的是属性动画结果就是button移动到右边就会获得点击事件;

问:帧动画,补间动画和属性动画的区别是什么?
答:明白了这三种动画的含义理解它们的区别就不难了:首先划分一下,帧动画是一类,剩下两者是一类,为什么这么划分呢?我是根据图片的数量来划分的,帧动画需要一套连续的图片才能完成动画效果,后两者一张图片足以,这里主要讨论的是后两者之间的区别。补间动画它只能达到四种效果或这四种效果的随机组合,这四种效果分别是:旋转 , 缩放 , 平移 ,透明度改变 ,超出这四种效果的动画是无法达到的,而属性动画则不受此限制,什么效果基本都可以达到,比如3D旋转,扭曲变化等,最本质的区别还是属性改变的这点上;

问:帧动画,补间动画和属性动画这三种动画怎么使用?
答:下面我用几个Demo分别演示如何实现Android这三种动画,先看效果图:

帧动画

这里写图片描述

实现步骤:

Step1

准备图片资源

这里写图片描述

Step2

新建 animation-list xml文件,将图片按顺序排列

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/girl_1"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_2"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_3"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_4"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_5"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_6"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_7"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_8"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_9"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_10"
        android:duration="200"/>
    <item
        android:drawable="@drawable/girl_11"
        android:duration="200"/>

</animation-list>

Step3

activity布局很简单,两个button和一个imageview,重点是imageview设置background为新建的animation-list文件,我就不贴出来了,在activity里面操作也很简单:调用AnimationDrawable的start()和stop()方法就能实现对帧动画的开始和停止,这里没有暂停的情况;

public class FrameActivity extends Activity {

    private AnimationDrawable mAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame);
        ImageView iv = (ImageView) findViewById(R.id.iv);
        mAd = (AnimationDrawable) iv.getBackground();
    }

    public void start(View v){
        mAd.start();
    }

    public void stop(View v){
        mAd.stop();
    }
}

下面是补间动画的效果图:

平移动画

这里写图片描述

旋转动画
这里写图片描述

缩放动画
这里写图片描述

透明度改变动画
这里写图片描述

组合动画
这里写图片描述

补间动画实现步骤:

Step1

在 res 文件夹下创建 anim 文件夹,新建五个动画xml文件,将动画定义在xml中的好处是比较直观,还可以复用;

这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<!-- 透明度改变动画 -->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1"
    android:toAlpha="0.2"/>
<!-- 旋转动画 -->
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="90"
    android:pivotX="50%"
    android:pivotY="50%"/>

<!-- 缩放动画 -->
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
       android:fromXScale="1"
       android:fromYScale="1"
       android:pivotX="50%"
       android:pivotY="50%"
       android:toXScale="1.5"
       android:toYScale="1.5"/>

<!-- 平移动画 -->
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
           android:fromXDelta="0"
           android:fromYDelta="0"
           android:toXDelta="200"
           android:toYDelta="300"/>

<!-- 组合动画 -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.2"/>
    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="180"/>
    <scale
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="3"
        android:toYScale="2"/>
    <translate
        android:fromXDelta="0"
        android:fromYDelta="100"
        android:toXDelta="200"
        android:toYDelta="500"/>
</set>

Step2

activity布局文件中由5个button和一个imageview,比较简单这里就不写了,直接上activity中的代码

public class TweenActivity extends Activity {

    private ImageView mIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tween);
        mIv = (ImageView) findViewById(R.id.iv_tween);
    }

    public void translate(View v){
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
        animation.setDuration(2000);//设置动画时长
        animation.setFillAfter(true);//保存动画后的效果
        mIv.startAnimation(animation);//开始动画
    }

    public void scale(View v){
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
        animation.setDuration(2000);
        animation.setFillAfter(true);//保存动画后的效果
        mIv.startAnimation(animation);
    }

    public void rotate(View v){
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate);
        animation.setDuration(2000);
        animation.setFillAfter(true);//保存动画后的效果
        mIv.startAnimation(animation);
    }

    public void alpha(View v){
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
        animation.setDuration(2000);
        animation.setFillAfter(true);//保存动画后的效果
        mIv.startAnimation(animation);
    }

    public void group(View v){
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.set);
        animation.setDuration(2000);
        animation.setFillAfter(true);//保存动画后的效果
        mIv.startAnimation(animation);
    }
}

最后来讲讲属性动画,首先了解几个常用的参数:

这里写图片描述

valueFrom:设置状态或位置的起始值;

valueTo:设置状态或位置的最终值;

ordering
1. sequentially :设置动画集合中的动画按顺序执行;
2. together :设置动画集合中的动画同时执行;

propertyName
1. translationX和translationY: 设置View的相对位置移动;
2. rotation、rotationX和rotationY:设置View的旋转;
3. scaleX和scaleY:设置View在X,Y轴上的缩放;
4. pivotX和pivotY:设置View的中心点位置;
5. x和y:设置View的绝对位置;
6. alpha:设置View的透明度;

valueType
1. intType:设置value值为int类型;
2. floatType:设置value值为float类型;
3. pathType:设置value值为String类型,用于制作矢量图的path;

关于几个系统提供的插值器的动画效果:
这里写图片描述

好了,先上一张利用属性动画实现的组合动画效果图,然后再进行步骤分解一一介绍:
这里写图片描述

实现步骤:

Step1

和部件动画一样,准备动画xml,在res文件夹下创建animator文件夹,新建动画集合文件group.xml;

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="together">
<!-- 旋转动画,Y轴为轴心翻转180度,重复次数50次,重复模式为反向,这里value样式要设置为float类型 -->
    <set>
        <objectAnimator
            android:propertyName="rotationX"
            android:repeatCount="50"
            android:repeatMode="reverse"/>
        <objectAnimator
            android:propertyName="rotationY"
            android:repeatCount="50"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="180"
            android:valueType="floatType"/>
    </set>

    <!-- 缩放动画 2倍-->
    <set>
        <objectAnimator
            android:propertyName="scaleX"
            android:valueFrom="1.0"
            android:valueTo="2.0">
        </objectAnimator>
        <objectAnimator
            android:propertyName="scaleY"
            android:valueFrom="1.0"
            android:valueTo="2.0">
        </objectAnimator>
    </set>

     <!-- 平移动画 -->
    <set>
        <objectAnimator
            android:propertyName="translationX"
            android:valueFrom="0"
            android:valueTo="300"
            android:valueType="floatType"/>
        <objectAnimator
            android:propertyName="translationY"
            android:valueFrom="0"
            android:valueTo="500"
            android:valueType="floatType"/>
    </set>

 <!-- 透明度改变动画 -->
    <set>
        <objectAnimator
            android:propertyName="alpha"
            android:valueFrom="0.3"
            android:valueTo="1.0"
            android:valueType="floatType"/>
    </set>
</set>

Step2

在activity中开启动画

public class PropertyActivity extends Activity {

    private ImageView mIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property);
        mIv = (ImageView) findViewById(R.id.iv_property);
    }

    public void propertyGroup(View v){
        AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.group);
        set.setTarget(mIv);//设置动画对象
        set.setDuration(2000);//设置持续时间
        set.setInterpolator(new OvershootInterpolator());//设置插值器
        set.start();//开始动画
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值