android之animation解析一

我们开发一款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组件使用动画 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值