ViewAnimation

android 动画 View Animation

记录关于动画的一些常用方法
视图动画又称为补间动画,给出两个关键帧,通过一些算法讲给定属性
值在给定的时间内在两个关键帧间渐变。

view Animation

view animation(视图动画) 只能用作view对象,是对
view的变换,默认支持的类型有:

  • 透明度的变化(alpha Animation).
  • 缩放(Scale Animation)
  • 位移(Translate Animation)
  • 旋转(Rotate Animation)

当然我们可以再一个view上使用多种动画,夹杂一些混合的两种或是三种以上,
此时使用AnimationSet让多个动画一块,使用插值器(interpolator)设置动画的速度.
更好的是写一些经常使用的动画作为xml,可以在用的时候直接拿过来,然后调用。

Alpha Animation 透明度动画

实质是改变视图的透明度,可以实现淡入淡出的效果。
只需要设置开始和结束的透明度。

//透明度从0.1到1.0
Animation animation = new AlphaAnimation(0.1f, 1.0f);

或在xml里面

<alpha android:fromAlpha = "0.1f" android:toAlpha="1.0f">
ScaleAnimation 缩放动画

缩放动画,支持设置开始x缩放和y缩放,结束x和y缩放,以及缩放基点x坐标,
缩放基点y坐标。
x缩放和y缩放都是相对于原始的宽度和高度,1.0表示不缩放。

坐标基点,同时有参数可以设置坐标的基点类型,分别是:

  • Animation.ABSOLUTE(默认值)相对于控件的0点的坐标值
  • Animation.RELATIVE_TO_SELF 相对于自己宽或是高的百分比(1.0表示100%)
  • Animation.RELATIVE_TO_PARENT 相对于父控件的宽或者高的百分比.

默认基点是视图的0点,默认坐标基点类型是ABSOLUTE.

而scale Animation 有很多构造函数:

ScaleAnimation (Context context, AttributeSet attrs)  
ScaleAnimation (float fromX, float toX, float fromY, float toY)  
new ScaleAnimation (1.0f, 1.5f, 1.0f, 1.5f);  
ScaleAnimation (float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)  
new ScaleAnimation (1.0f, 1.5f, 1.0f, 1.5f, 10, 10);  
ScaleAnimation (float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYType)  
//相对于自己,以中心点为基点
new ScaleAnimation (1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f) ;  

XML配置:

<scale
    android:fromXScale="float"  
    android:toXScale="float"  
    android:fromYScale="float"  
    android:toYScale="float"  
    android:pivotX="float"  
    android:pivotX="float"  
    />  
TranslateAnimation 位移

平移动画:平移支持x轴平移起点和y轴平移起点,以及设置结束点。同时每个点都是可以设置为type,
type和上面的缩放动画的基点类型一样,默认类型是ABSOULTE.
构造函数如下:

TranslateAnimation (Context context, AttributeSet attrs)  
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)  
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,   
    int fromYType, float fromYValue, int toYType, float toYValue);  

它的xml 配置:

<translate
        android:fromXDelta="float"  
        android:toXDelta="float"  
        android:fromXDelta="float"  
        android:toXDelta="float"  
/>  
RotationAnimation 旋转

选择动画:旋转支持设置旋转开始角度,和旋转结束角度,以及旋转基点,和旋转基点类型。
类型和上面一样,默认选择基点是(0, 0),默认类型和上面一样。

看一下它的构造函数:

RotateAnimation (Context context, AttrbuteSet attrs);  
RotateAnimation(float fromDegrees, float toDegrees);  
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY);  
otateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue);  

它的xml配置是:

<rotate 
        android:fromDegrees="float"  
        android:toDegrees="float"  
        android:pivotX="float"  
        android:pivotY="float"
        />
AnimationSet 多重动画

实现多个动画一起运行,或是依次执行,达到更好的效果 。
通过 addAnimation(Animation animation) 向集合中添加动画,使用子动画的 setStartOffset(long offset)
设置延时,从而实现子动画之间的间隔,可以设置是否共享时间插值器。

xml配置 :

<set>  
<!--这里加入需要的子动画-->  
<rotate ..../>  
<alpha ..../>  
</set>  
animation

前面的几个动画都是继承Animation ,像时常,插值器,是否重复,监听等。
setFillBefore(boolean)和setFillAfter(boolean)分别是动画开始前和动画结束后是否保持动画状态,
默认前者为true,后者为false,即不保存动画后的状态,可按照需要自行修改。
xml中可以配置的属性(这些在前面的动画中省略了,也可以使用):

android:detachWallpaper  
android:duration  
android:fillAfter  
android:fillBefore  
android:interpolator  
android:repeatCount  
android:repeatMode     INFINTE(无限期),RESTART(重新开始,默认值)  
android:startOffset  
android:zAdjustment   ZORDER_BOTTOM,ZORDER_NORMAL, ZORDER_TOP  

启动动画:

view.startAnimation();  
//or  
view.setAnimation(animatioin);  
animation.start();  
Interpolator 插值器

通过设置插值器可以改变动画的速度,以及最终的效果。
android sdk 提供了几种默认的插值器,而且这些插值器在新的 protery animation 上依然可以使用,

  • AccelerateDecelerateInterpolator 先加速后减速
  • AccelerateInterpolator 加速
  • AnticipateInterPolator
  • AnticipateOvershootInterpolator
  • BounceInterpolator
  • CycleInterpolator
  • LinearInterpolator
  • OvershootInterpolator
  • PathInterpolator

同样,可自行自定义Interpolator,一般开始值为0,结束值为1.0,然后根据算法来改变值。

动画原理

动画就是根据间隔时间,不停的去刷新界面,把时间分片,在那个时间片,通过传入插值器
到Animation.applyTransformation(), 来计算当前的值(旋转角,透明度).
因此,我们也可以继承Animation,从写applyTransformation()来实现我们的其他的动画。

注意

使用view动画时,如果需要用到类似基点类型和基点设置的,一定要注意设置对点,
不然效果很差。
另外,view动画,若动画前view在a点,动画过程以及动画后,view变化了位置,
但点击点仍然在原位置,特别注意!!!