Android动画技术分析

Android动画技术分析

动画

本文将介绍Android动画的实现技术。Android动画实现有三种技术,逐帧动画(Drawable Animation),补间动画(View Animation)和属性动画(Property Animation)。下面列出了三者的特点:

1. 逐帧动画 
	图片一帧帧的播放,类似动画片
2. 补间动画
	将原始图片进行一系列的变换:平移,选择,缩放,淡入淡出。
	缺陷
        1) 只能对view进行变换,不能对自定义的非view对象进行变换,如自定义个代表点位置的Point类
        2) 不支持四种变换外的其他变换,如更换背景
        3) 只改变view的效果,不改变view的属性,如移动到新的位置后不响应点击事件
3. 属性动画
        1) 实现真正的移动
        2) 进行丰富的变换

逐帧动画和补间动画局限性比较大,属性动画的效果更加丰富完善,接下来我们介绍属性动画的使用方法。

属性动画主要涉及到三个类,ValueAnimator,ObjectAnimator和AnimatorSet。其中ValueAnimator用于对数值进行动画处理,ObjectAnimator用于对对象的某个属性进行动画处理,而AnimatorSet则用于组合动画的实现。

ValueAnimator:实现300毫秒内从0平滑变换到1。

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float currentValue = (float) animation.getAnimatedValue();
        Log.d("TAG", "cuurent value is " + currentValue);
    }
});
anim.start();

ObjectAnimator:实现将Textview的translationX属性在1000毫秒内从当前值向左移100像素。

float curTranslationX = textView.getTranslationX();
ObjectAnimator moveLeftAnim = ObjectAnimator.ofFloat(textView, "translationX", 
                          curTranslationX, curTranslationX - 100);
moveLeftAnim.setDuration(1000);
moveLeftAnim.start();

AnimatorSet:组合动画,Textview先从屏幕左侧进入屏幕中心,然后旋转360度同时先变淡后变深。

ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();

AnimatorListener:Animator监听器,可以给动画效果添加监听器,处理开始动画,结束动画,重复动画,取消动画的事件

anim.addListener(new AnimatorListener() {
   @Override
   public void onAnimationStart(Animator animation) {
   }

   @Override
   public void onAnimationRepeat(Animator animation) {
   }

   @Override
   public void onAnimationEnd(Animator animation) {
   }

   @Override
   public void onAnimationCancel(Animator animation) {
   }
});

AnimatorListenerAdapter:提供了AnimatorListener四种回调函数的默认实现,可以按需重写某个监听事件。

anim.addListener(new AnimatorListenerAdapter() {  
}); 

使用XML编写动画:通过XML编写动画,可以实现动画的重用。为了区别,一般把补间动画的xml放在res/anim文件夹下,属性动画xml放在res/animator文件夹下。

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >

    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType" >
    </objectAnimator>

    <set android:ordering="together" >
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" >
        </objectAnimator>

        <set android:ordering="sequentially" >
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType" >
            </objectAnimator>
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:="floatType" >
            </objectAnimator>
        </set>
    </set>
</set>

调用方式如下:

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);  
animator.start();

参考:
https://developer.android.com/guide/topics/graphics/overview.html
http://blog.csdn.net/guolin_blog/article/details/43536355

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章