欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android动画分析详解(一) View动画、帧动画、LayoutAnimation、Activity切换动画

程序员文章站 2024-03-24 20:55:46
...

Android动画分析详解

在Android中动画可以分为三种:View动画、帧动画、属性动画。View动画是通过
操作对象做图形变换(缩放、平移、旋转、透明度)从而达到动画的效果,帧动画是通
过将一个完整的动画的效果分割成一一帧图片,通过顺序播放每一帧图片达到动画的
效,属性动画是通过不断改变对象的属性值达到动画效果,这是Android3.0后新增的
动画效果。

属性动画与View动画的区别在于属性动画操作的是View的属性,而View动画操作的只是View的影像。举个例子:在给一个button设置了点击事件后,使用View动画改变button位置,在新的位置点击事件没有效果,这是因为View动画操作的只是影像,这个button本质上是没有变化的。

View动画

View动画是作用在View对象上,在Android中对应Animation类,它支持四种动画效果:
旋转,平移,缩放,透明度,分别对应Animation类的子类:RotateAnimation,TranslateAnimation,ScaleAnimation,AlphaAnimation,还有一个AnimationSet类,代表动画集的概念,可以包含多种动画,也可包含另外的动画集。

View动画的创建可以通过在代码中创建对应动画效果类的对象即可,也可以通过在XML布局文件中创建,这也是比较方便的写法。

AnimationSet(动画集)

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"     动画时长
android:fillAfter="true"    动画结束后是否维持当前状态   
android:shareInterpolator="true"> 集合中的动画是否和动画集使用同一个插值器
<!--这里添加各种动画效果-->
</set>

TranslateAnimation(平移动画)

可以使View在水平或竖直方向进行平移的动画效果

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0" x起始值
android:fromYDelta="0" y起始值
android:toXDelta="100" x结束值
android:toYDelta="100" y结束值
/>

RotateAnimation(旋转动画)

使View沿着轴点旋转一定的角度,默认轴点事View的中心点。

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0" 旋转起始角度
android:toDegrees="90" 旋转结束角度
android:pivotX="100" 旋转中心点X坐标
android:pivotY="100" 旋转中心点Y坐标
/>

ScaleAnimation(放大缩小动画)

可以使View具有放大缩小的动画效果,默认放大缩小的中心点是View的中心点

<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="100" 中心点的X坐标
android:pivotY="100" 中心点Y坐标
android:fromXScale="1" 水平方向缩放的起始值
android:fromYScale="1" 竖直方向缩放的起始值
android:toXScale="1.5" 水平方向缩放的结束值
android:toYScale="1.5" 竖直方向缩放的结束值
/>

AlphaAnimation(透明度动画)

可以使View有一个透明度变化的动画效果

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1" 透明度起始值
android:toAlpha="0.5" 透明度结束值
/>

上述例子都是在XML布局文件中定义View动画,那么如何使用这些布局动画呢,需要用到
AnimationUtils类的静态方法:
public static Animation loadAnimation(Context context, @AnimRes int id)

将所需要的参数传入得到Animation对象,调用View的startAnimation()方法即可设置动画效果。
/**
* Start the specified animation now.
*
* @param animation the animation to start now
*/
public void startAnimation(Animation animation) {

另外Animation类也提供了View动画的播放过程监听,通过setAnimationListener

void onAnimationStart(Animation animation);     动画开始
 void onAnimationEnd(Animation animation);      动画结束
void onAnimationRepeat(Animation animation);  重复播放

帧动画(AnimationDrawable)

通过顺序的播放一组准备好的图片,形成动画的效果,Android提供了AnimationDrawable类来使用帧动画,比较简单。

在XML文件中定义

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:duration="200" android:drawable="@drawable/ic_preview"/>
<item android:duration="200" android:drawable="@drawable/ic_preview2"/>
</animation-list>

在代码中使用帧动画

tv.setBackgroundResource(R.drawable.animation_list_layout);
AnimationDrawable background = (AnimationDrawable) tv.getBackground();
background.start();

通过View对象的setBackgroupResource()设置帧动画布局,然后得到帧动画对象,调用start()方法开始播放动画。

关于View动画的一些特殊使用场景

LayoutAnimation

作用于ViewGroup,让ViewGroup中的子元素具有出场的动画效果,典型案例ListView,给ListView设置了LayoutAnimation后,每一个item 都会具有绚丽的动画效果。

实现步骤:

1.定义一个LayoutAnimation(/res/anim/xxx.xml)

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="500"
android:animation="@anim/alpha_layout"
android:animationOrder="random"
/>

delay:子元素进场动画的延时时间
animation:定义好的View动画资源文件
animationOrder:子元素进场顺序reverse:逆序进入random:随机进入normal:正常

两种方式设置给ViewGroup:

  1. 布局文件 通过 android:layoutAnimation=”“
  2. 代码中设置,通过ViewGroup的方法setLayoutAnimation:
    public void setLayoutAnimation(LayoutAnimationController controller)

    这里需要一个LayoutAnimationController动画控制类,直接实例化
    Animation animation = AnimationUtils.loadAnimation(this, R.anim.layout_animation_layout);
    LayoutAnimationController controller = new LayoutAnimationController(animation);
    ll.setLayoutAnimation(controller);

Activity切换动画效果

在Activity进入或者退出时可以指定特殊的动画效果通过overridePendingTransition()

public void overridePendingTransition(int enterAnim, int exitAnim)

enterAnim:Activity被打开时的动画资源ID
exitAnim:Activity退出时的动画资源ID

需要注意的是该方法必须要在startActivity()和finish()方法之后调用才能生效