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变化了位置,
但点击点仍然在原位置,特别注意!!!