我们开发一款app,为了用户体验效果更好,必然少不了动画的效果,动画之前我用flash做过一些简单的小demo,后来android开发中,我们可以不用flash也可以做出那样的效果,而且自己比较喜欢这些小动画的,就私下来自己研究了,来分享给大家。
Activity的切换动画
从安卓2.0开始在Activity增加了一个方法:
public void overridePendingTransition (int enterAnim, int exitAnim)
其中第一个参数为进入时的动画,第二参数为退出时的动画。
该方法需要在startActivity或者finish方法之后调用。
修改Activity的动画样式:
<style name="Theme.Test" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowAnimationStyle">@style/Animation.Activity.Test</item>
</style>
<style name="Animation.Activity.Test" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="android:activityOpenExitAnimation">@anim/activity_open_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="android:activityCloseExitAnimation">@anim/activity_close_exit</item>
<item name="android:taskOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="android:taskOpenExitAnimation">@anim/activity_open_exit</item>
<item name="android:taskCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="android:taskCloseExitAnimation">@anim/activity_close_exit</item>
<item name="android:taskToFrontEnterAnimation">@anim/activity_open_enter</item>
<item name="android:taskToFrontExitAnimation">@anim/activity_open_exit</item>
<item name="android:taskToBackEnterAnimation">@anim/activity_close_enter</item>
<item name="android:taskToBackExitAnimation">@anim/activity_close_exit</item>
</style>
在清单文件中给Activity设置该样式即可。
如果我们把以上的动画全定义成@null,那么Activity切换就不会出现动画了,连系统自带的动画也不会出现。
如果在Activity的样式文件中加入了下面的代码,则Activity就会出现Dailog的样式了:
true
补间动画
Android的animation由四种类型组成
详见文档 android-sdk-windows/docs/guide/topics/resources/animation-resource.html
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
alpha–>AlphaAnimation
scale–>ScaleAnimation
一种是frame by frame(画面转换动画)
translate–>TranslateAnimation
rotate–>RotateAnimation
在XML文件中定义动画
在res目录下建立anim文件夹,创建xml文件:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
/>
以上为创建一个透明度渐变的动画。
当有多个动画需要组合到一起时,使用set元素包裹:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha/>
<scale/>
<translate/>
<rotate/>
</set>
以上为创建一个组合动画。
Android动画解析–XML
1、透明渐变动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"
/>
</set>
fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度,透明度取值为0.0-1.0之间的float型数字,0.0为全透明,1.0为完全不透明
duration 属性为动画持续时间,单位为毫秒
2、比例变化动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
</set>
interpolator 指定一个动画的插入器
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
以上四种属性取值为float型数字,0.0表示收缩到没有,1.0表示正常无伸缩,值小于1.0表示收缩,值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
以上两种属性从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
duration 属性为动画持续时间,单位为毫秒
fillAfter 属性当设置为true,动画结束后保留结束时的状态,当设置为false,动画结束后回到动画最初时候的状态。
3、位移动画:
<translate>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="30"
android:toXDelta="-80"
android:fromYDelta="30"
android:toYDelta="300"
android:duration="2000"
/>
</set>
fromXDelta 属性为动画起始时 X坐标上的位置
toXDelta 属性为动画结束时 X坐标上的位置
fromYDelta 属性为动画起始时 Y坐标上的位置
toYDelta 属性为动画结束时 Y坐标上的位置
以上四种属性可以加%和p,例如:
android:toXDelta=”100%”,表示自身的100%,也就是从View自己的位置开始。
android:toXDelta=”80%p”,表示父层View的80%,是以它父层View为参照的。
duration 属性为动画持续时间,单位为毫秒
4、旋转动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<rotate
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+350" />
</set>
interpolator 指定一个动画的插入器
fromDegrees 属性为动画起始时物件的角度
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
当角度为负数——表示逆时针旋转,当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)(负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转)
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
以上两种属性从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
duration 属性为动画持续时间,单位为毫秒
获取XML中的动画
public static Animation loadAnimation (Context context, int id)
//第一个参数Context为程序的上下文,第二个参数id为动画XML文件的引用
例子:myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);
在代码中定义动画
AlphaAnimation(float fromAlpha, float toAlpha)
//第一个参数fromAlpha为 动画开始时候透明度
//第二个参数toAlpha为 动画结束时候透明度
Animation myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
myAnimation_Alpha.setDuration(5000);//设置时间持续时间为 5000毫秒
----------
ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一个参数fromX为动画起始时 X坐标上的伸缩尺寸
//第二个参数toX为动画结束时 X坐标上的伸缩尺寸
//第三个参数fromY为动画起始时Y坐标上的伸缩尺寸
//第四个参数toY为动画结束时Y坐标上的伸缩尺寸
//第五个参数pivotXType为动画在X轴相对于物件位置类型
//第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第七个参数pivotXType为动画在Y轴相对于物件位置类型
//第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置
Animation myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Scale.setDuration(700);//设置时间持续时间为 700毫秒
----------
RotateAnimation(float fromDegrees, float toDegrees,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一个参数fromDegrees为动画起始时的旋转角度
//第二个参数toDegrees为动画旋转到的角度
//第三个参数pivotXType为动画在X轴相对于物件位置类型
//第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第五个参数pivotXType为动画在Y轴相对于物件位置类型
//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置
Animation myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Rotate.setDuration(3000);//设置时间持续时间为 3000毫秒
----------
RotateAnimation(float fromDegrees, float toDegrees,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一个参数fromDegrees为动画起始时的旋转角度
//第二个参数toDegrees为动画旋转到的角度
//第三个参数pivotXType为动画在X轴相对于物件位置类型
//第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第五个参数pivotXType为动画在Y轴相对于物件位置类型
//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Rotate.setDuration(3000);//设置时间持续时间为 3000毫秒
----------
使用动画:
View.startAnimation(animation); //View组件使用动画