美文网首页程序员Android开发Android技术知识
Android动画系列——View动画和帧动画

Android动画系列——View动画和帧动画

作者: zackyG | 来源:发表于2018-12-31 23:16 被阅读5次

Android开发中,常用的动画有三种,View动画,帧动画和属性动画。

View动画

View动画也被称为TweenAnimation,是在视图上执行补间动画,它作用于视图整体。补间动画指的是只要指定动画开始和结束时刻的“关键帧”,而动画变化过程的“中间帧”由系统计算并补齐。无论动画如何改变视图的显示区域,视图原来的边界也不会自动调整(缩放)来适应视图动画的显示区域。那么就可以这样理解:视图通过ScaleAnimation或者TranslateAnimation动画,使显示区域超过了视图原有的边界,视图不会被剪裁。与之相反的是,当视图的动画超过父容器的边界时,显示区域将被剪裁。
系统提供的View动画有且只有4种:TranslateAnimation(平移动画)、AlphaAnimation(透明度动画)、ScaleAnimation(缩放动画)、Rotation(旋转动画)。他们都是以Animation类的派生类。具体的相关类的继承图如下:


Animation的派生类

AnimationSet是动画集合类,可以将多个不同的XxxAnimation组合,形成一组复杂效果的View动画。
使用View动画主要有两种方式,xml定义和代码定义:
先看看xml定义,首先在res/anim目录下定义一个xml文件

<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="2000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="200" />
</set>

然后通过AnimationUtils加载xml中的动画,生成Animation对象

TranslateAnimation translateAnimation = AnimationUtils.loadAnimation(context,R.anim.anim_translate);
intentBtn.startAnimation(translateAnimation);

最后调用视图的startAnimation方法给视图设置动画并开始。
再来看看在代码中定义:

TranslateAnimation translateAnimation = new TranslateAnimation(0f, 0f, 0f, 200f);
translateAnimation.setDuration(1000);//动画的持续时间,单位毫秒
translateAnimation.setFillAfter(true);//参数为true表示动画结束后View停留在结束位置
intentBtn.startAnimation(translateAnimation);

上面的代码是简单的Animation动画的使用方式,其中值得一提的是,setFillAfter(true)方法,参数为true,表示动画结束后,视图停留在完成时的位置;参数为false(默认),表示动画结束后,视图还原到起始位置。
我们还可以给Animation设置监听事件,监听动画的开始和结束

translateAnimation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        //动画开始时调用
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                      //动画结束时调用
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                      //动画重复播放时调用
                    }
                });
View动画的两个常用的特殊场景
  • ViewGroup子视图的布局动画(LayoutAnimation)。以ListView为例:
//然后在代码中,给ListView设置动画(LayoutAnimation)
LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in));
lac.setDelay(0.5f);
lac.setOrder(LayoutAnimationController.ORDER_RANDOM);
mListView.setLayoutAnimation(lac);

//也可以layout文件中给ListView设置layoutAnimation属性
<ListView
    android:id="@+id/listView"
    android:layoutAnimation="@anim/anim_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>

layoutAnimation虽然是API 1中就已经引入,但只能在ViewGroup初次创建时才能使用指定动画。容器创建以后,再往ViewGroup里加Item就不会再有动画。在API 11之后,Android为了支持ViewGroup类控件,在添加和移除其中控件时自动添加动画,为我们提供了一个非常简单的属性:android:animateLayoutChanges=“true”,所有派生自ViewGroup的控件都具有此属性,只要在XML中添加上这个属性,就能实现添加/删除其中控件时,带有默认动画了。但是这个属性设置后,只能使用默认的动画,不支持自定义动画。同时在API 11时引入的LayoutTransaction也能起到LayoutAnimation+animateLayoutChanges效果,并且能够设置自定义动画。它的使用涉及到属性动画,相对LayoutAnimation的使用更复杂,以后再提。

  • 通过补间动画(Tween animation)为Activity自定义切换动画
    Android系统为Activity设置了默认的切换动画,这个动画我们是可以进行自定义的。通过调用Activity类的overridePendingTransition(int enterAnim, int exitAnim)方法可以实现自定义Activity的切换动画,注意这个方法必须在startActivity和finish调用之后被调用,否者没有效果。
View动画的缺点

它只是改变了视图的显示,但没有改变视图的响应区域。也就是说,比如你用ScaleAnimation将视图放大或缩小,其实视图的点击响应区域还是动画开始前的位置;或者用TranslateAnimation将视图平移到另一个位置,点击响应区域还是在动画开始前的位置,而动画结束时视图所在的区域没有点击响应。

帧动画

帧动画也就是Drawable动画,是用来逐帧显示定义好的一组图片或者Drawable资源。效果类似于范灯片,一张张地切换图片。对应于AnimationDrawable类。实际的开发中,帧动画使用的场景相对较少。
典型的用法如下:
首先在res/drawable目录下通过xml定义一个帧动画(AnimationDrawable)

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >
    <item
        android:drawable="@drawable/first_pic"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/second_pic"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/third_pic"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/fourth_pic"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/fifth_pic"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/sixth_pic"
        android:duration="1000"/>
</animation-list>

<animation-list>标签表示一组帧动画,oneshot属性为true,表示动画只播放一次,否则就会重复播放。每一个item对应每一帧的图片。duration属性表示每一帧显示的时间。
接下来将定义好的AnimationDrawable设置为View的背景或者ImageView的图像

AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.anim_list);
image.setImageDrawable(animationDrawable);
animationDrawable.start();

以上是通过xml的方式定义帧动画(AnimationDrawable),当然也可以通过代码来定义

AnimationDrawable animationDrawable = new AnimationDrawable();
animationDrawable.addFrame(getResources().getDrawable(R.drawable.first_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.second_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.third_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.fourth_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.fifth_pic), 1000);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.sixth_pic), 1000);
animationDrawable.setOneShot(true);
image.setImageDrawable(animationDrawable);
animationDrawable.start();

有一点需要强调的是:启动animationDrawable.start()不能在Activity的onCreate和onStart中调用,因为在onCreate和onStart中AnimationDrawable还没有完全的与ImageView绑定,在onCreate和onStart中启动动画,就只能看到第一张图片。解决的办法是确保Activity在Resume状态下调用animationDrawable.start()。
帧动画的缺陷是不能添加监听事件。

本文参考:
https://www.jianshu.com/p/b117c974deaf
https://www.jianshu.com/p/5d811aaf4541
http://wiki.jikexueyuan.com/project/android-animation/12.html

相关文章

  • Android开发之帧动画

    Android动画主要分为3种 View动画(Android开发之View动画) 帧动画 属性动画 何为帧动画? ...

  • Android开发之属性动画

    Android动画主要分为3种 View动画(Android开发之View动画) 帧动画(Android开发之帧动...

  • Android动画深入分析

    Android的动画可以分为三种:View动画、帧动画和属性动画。(其实帧动画也可以算属于View动画,只是表现形...

  • Android读书笔记(7)—— Android动画深入分析

    一、View动画 Android动画分为三种:View动画、帧动画和属性动画。 1、View动画的种类 View动...

  • Android开发之View动画

    Android动画主要分为3种 View动画 帧动画 属性动画 何为View动画? View动画主要是对View对...

  • Android动画系列——View动画和帧动画

    Android开发中,常用的动画有三种,View动画,帧动画和属性动画。 View动画 View动画也被称为Twe...

  • Android 动画分析

    Android的动画可以分为三种:View动画、帧动画和属性动画,其实帧动画也属于View动画的一种,只不过它和平...

  • Android 动画之View动画

    简介 Android动画主要有三种类型:View动画、帧动画和属性动画。其中,帧动画也是View动画的一种,它通过...

  • 你了解Android中的动画吗?

    Android的动画可以分为三种:View动画、帧动画和属性动画,其实帧动画也属于View动画的一种,只不过它和平...

  • 开发艺术之Animation

    Android 动画可分为三种:View动画、帧动画和属性动画。帧动画也属于 View 动画的一种,只不过它和平移...

网友评论

    本文标题:Android动画系列——View动画和帧动画

    本文链接:https://www.haomeiwen.com/subject/pbnwlqtx.html