在Android中,实现View的Animition有两种方式: 1、在XML文件中定义 2、在代码中实现
方法一:在XML文件中定义Animation(XML文件放置于于 /res/anim文件夹下)
示例XML代码如下:(文件名:alpha_scale_translate_rotate_anim.xml)
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--
Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效
Alpha:渐变透明度动画效果
Scale:渐变尺寸伸缩动画效果
Translate:画面转换位置移动动画效果
Rotate:画面旋转动画效果
Tween Animation 通用属性[类型] 功能
Duration[long] 属性为动画持续时间 时间以毫秒为单位
fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用
interpolator 指定一个动画的插入器 有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int] 动画的重复次数
RepeatMode[int] 定义重复的行为 1:重新开始 2:plays backward
startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
1:保持在最上层
-1:保持在最下层
-->
<!--
透明控制动画
-->
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"
/>
<!-- 尺寸伸缩动画效果 scale
属性:interpolator 指定一个动画的插入器
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
布尔型值:
fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
-->
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount="1"
android:fromXScale="0.5"
android:fromYScale="0.5"
android:toXScale="1.4"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="3000"
/>
<!--
画面转换位置移动动画效果 translate
fromXDelta toXDelta 为动画、结束起始时 X坐标上的位置
fromYDelta toYDelta 为动画、结束起始时 Y坐标上的位置
-->
<translate
android:repeatCount="2"
android:fromXDelta="-30"
android:fromYDelta="-30"
android:toXDelta="-80"
android:toYDelta="200"
android:duration="3000"
/>
<!--
画面转移旋转动画效果 rotate
fromDegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY 为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
-->
<rotate
android:interpolator="@android:anim/accelerate_interpolator"
android:repeatCount="2"
android:fromDegrees="0"
android:toDegrees="+270"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
/>
</set>
调用该动画的代码如下:
btnDemo = (Button) findViewById(R.id.btnDemo);
Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha_scale_translate_rotate_anim); btnDemo.startAnimation(anim);
//或者:
// btnDemo .setAnimation(mAnimation);
// btnDemo.startLayoutAnimation();
几个需要注意的问题:
1、在Anim的XML Attributes中有fillAfter和fillBefore这两个属性,很多人发现在xml文件中设置没有效果。其实不然,首先要将android:fillEnabled设置为true,其次在<set>中设置,如下:
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:fillEnabled="true"
android:fillAfter="true" //默认为false,而fillBefore默认值为true
>
2、对于<set></set>作用的理解:
凡是在同一个<set>.....</set>中定义的动画效果(如scale、rotate)是同时发生的,如果需要让一个view分段执行某一效果或者某一效果集合,这需要在不同的<set>.....</set>中定义,View会按顺序先后执行。这也就是为什么上面说fillAfter和fillBefore要在<set...>中声明的原因。
3、fillAfter(其作用请看google文档)被设置为true的时候,View在执行动画后,会停在其动画最后一帧的状态下,虽然有时候需要这么做,但是view相应的触摸的位置还是在其执行动画前的位置。这个问题还有待解决!!
方法二:在代码中定义动画
Animation anim = null;
anim = new RotateAnimation(0.0f,+360.0f);
anim.setInterpolator(new AccelerateDecelerateInterpolator());
anim.setDuration(3000);
调用的方式和方法一是一样的