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

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()方法之后调用才能生效

猜你喜欢

转载自blog.csdn.net/swollow_/article/details/80771334