Android动画之视图动画
Android中的动画分类
1. 视图动画
Tween动画 :平移动画、旋转动画、缩放动画、渐变动画
Frame动画 :AnimationDrawable,一般由多张图片按照一定的时间间隔显示。
2. 属性动画
这篇重点写视图动画
视图动画可以用Java纯代码写,也可以使用xml调用。
使用Tweened Animations的Java代码使用步骤:
1. 创建一个AnimationSet对象
2. 根据需要创建相应的Animation对象(AlphaAnimation、RotateAnimation、ScaleAnimation、TranslateAnimation)
3. 设置Animation对象相应的数据(duration, startoffset......)
4. 使用addAnimation方法将Animation对象添加到AnimationSet对象当中
5. 使用控件对象开始执行AnimationSet
view.startAnimation(animation);
view.setAnimation(animation);
view.startNow();
取消动作:
animation.cancel(); //动作本身取消
animationset.cancel(); //动作集取消
(View控件)img.clearAnimation(); //控件取消附在其上的动作
在XML中设置动画效果步骤:
1. 在res文件夹下新建一个名为anim的文件夹
2. 创建xml文件,并首先加入set标签(set标签就相当于Java代码中的AnimationSet)
3. 在Set标签中加入alpha,scale,rotate,translate标签(相当于Java代码
中的AlphaAnimation,ScaleAnimation,RotateAnimation,TranslateAnimation)
4. 在Java代码中使用AnimationUtils的loadAnimation方法来加载XML文件,并得到一个Animation对象
5. 使用控件的startAnimation()方法执行这个Animation对象
那么通用的属性:
- android:duration:设置动画持续时间
- android:fillAfter:如果fillAfter设为true,则动画执行后,控件将停留在动画结束的状态
- android:fillBefore:如果fillBefore设为true,则动画执行后,控件将回到动画开始的状态
- android:startOffset(long startOffset):设置动画执行之前等待的时间(单位:毫秒)
- android:repeatCount(int repeatCount):设置动画重复的次数
- android:interpolator:设置动画的变化速度,其值:
android:interpolator="@android:anim/accelerate_decelerate_interpolator":先加速,后减速
android:interpolator="@android:anim/accelerate_interpolator":加速
android:interpolator="@android:anim/decelerate_interpolator":减速
android:interpolator="@android:anim/cycle_Interpolator":动画循环播放特定次数,速率改变沿着正弦曲线
android:interpolator="@android:anim/linear_Interpolator":匀速
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:duration="2000"
android:fromAlpha="0.0"
android:toAlpha="1.0" >
</alpha>
</set>
fromAlpha : 动画开始的透明度
toAlpha : 表示动画结束的透明度
duration : 便是动画的持续时间,单位为毫秒,2000毫秒表示2秒。
startOffset : 表示动画开始的延迟时间,点击开始1秒后开始执行,单位也是毫秒。
1.0表示完全不透明,0.0便是完全透明,两个都是浮点数。
rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<rotate
android:duration="1000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+360" />
</set>
fromDegrees动画开始的角度,toDegress动画结束的角度,正数为顺时针,负数为逆时针,pivotX,piovtY:旋转的中心坐标位置,设置的方式与缩放相似。
scale.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="2000"
android:fillAfter="false"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
fromXScale,fromXScale动画开始时x,y的缩放大小,toXScale,toXScale:动画结束的x,y缩放大小,1表示本身大小,数值越大,缩放比例越大,pivotX,piovtY:缩放的中心坐标位置,可以设置值与平移动画可以设置的类似:
50: 表示50个像素,是绝对值
50%: 表示自身中心位置
50%p :表示父元素的中心位置,p表示相对于父元素
translate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="1000"
android:fromXDelta="10"
android:fromYDelta="10"
android:toXDelta="100"
android:toYDelta="100" />
</set>
fromXDelta,fromYDelta表示动画开始时的x,y坐标,toXDelta,toYDelta动画结束的x,y坐标,这里需要注意的是他可以设置三种类型的值,比如我们设置50:
50%: 表示自身大小一半,记住这里是可以设置%号的,他等于0.5,如果设置0.5表示绝对值0.5
50%p :表示父元素大小的一半,p表示相对于父元素
其他:
Java中,时间使用毫秒单位来表示,因为计算机提供了毫秒精度的时间,1秒=1000毫秒
设置按钮居中:
在 LinearLayout 或者 FrameLayout布局文件中:android:layout_gravity="center"
在RelativeLayout布局文件中:android:layout_centerInParent="true"