Android中Animation动画详解
2016-02-19 16:16
393 查看
动画类型
Android的animation由四种类型组成Xml中
属性值 | 含义 |
---|---|
alpha | 渐变透明度动画效果 |
scale | 渐变尺寸伸缩动画效果 |
translate | 画面转换位置移动动画效果 |
rotate | 画面转移旋转动画效果 |
类名 | 含义 |
---|---|
AlphaAnimation | 渐变透明度动画效果 |
ScaleAnimation | 渐变尺寸伸缩动画效果 |
TranslateAnimation | 画面转换位置移动动画效果 |
RotateAnimation | 画面转移旋转动画效果 |
动画模式
Animation主要有两种动画模式:tweened animation(渐变动画)
XML | JavaCode |
---|---|
alpha | AlphaAnimation |
scale | ScaleAnimation |
XML | JavaCode |
---|---|
translate | TranslateAnimation |
rotate | RotateAnimation |
XML文件中定义动画
打开Eclipse,新建Android工程在res目录中新建anim文件夹
在anim目录中新建一个myanim.xml(注意文件名小写,名字可以自己定义)
加入XML的动画代码
<xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha/> // 透明度动画 <scale/> // 缩放动画 <translate/> // 平移动画 <rotate/> // 旋转动画 </set>
Android动画解析–XML
透明度动画(alpha)<?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 | 动画起始时透明度 | 浮点数型(0.0-1.0) | 0.0表示完全透明,1.0表示完全不透明 |
toAlpha | 动画结束时透明度 | 浮点数型(0.0-1.0) | 0.0表示完全透明,1.0表示完全不透明 |
duration | 动画持续时间 | 长整型 | 时间以毫秒为单位 |
<?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" // 动画起始时,X坐标上的伸缩尺寸 android:toXScale="1.4" // 动画结束时,X坐标上的伸缩尺寸 android:fromYScale="0.0" // 动画起始时,Y坐标上的伸缩尺寸 android:toYScale="1.4" // 动画结束时,Y坐标上的伸缩尺寸 android:pivotX="50%" // 动画相对于物件的X坐标的开始位置 android:pivotY="50%" // 动画相对于物件的Y坐标的开始位置 android:duration="700" // 动画持续时间 /> </set>
属性 | 含义 | 说明 |
---|---|---|
interpolator | 指定动画的插入器 | accelerate_decelerate_interpolator(加速-减速),accelerate_interpolator(加速),decelerate_interpolator(减速) |
fromXScale | 动画起始时,X坐标上的伸缩尺寸(浮点型) | 0.0表示收缩到没有,1.0表示正常无伸缩,值小于1.0表示收缩,值大于1.0表示放大 |
toXScale | 动画结束时,X坐标上的伸缩尺寸 | 同上 |
fromYScale | 动画起始时,Y坐标上的伸缩尺寸 | 同上 |
toYScale | 动画结束时,Y坐标上的伸缩尺寸 | 同上 |
pivotX | 动画相对于物件的X坐标的开始位置 | 从0%-100%中取值, 50%为物件的X或Y方向坐标上的中点位置 |
pivotY | 动画相对于物件的Y坐标的开始位置 | 同上 |
duration | 动画持续时间 | 以毫秒为单位 |
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="30" // 动画起始时,X坐标上的位置 android:toXDelta="-80" // 动画结束时,X坐标上的位置 android:fromYDelta="30" // 动画起始时,Y坐标上的位置 android:toYDelta="300" // 动画结束时,Y坐标上的位置 android:duration="2000" // 动画持续时间 /> </set>
属性 | 含义 | 说明 |
---|---|---|
fromXDelta | 动画起始时,X坐标上的位置 | |
toXDelta | 动画结束时,X坐标上的位置 | |
fromYDelta | 动画起始时,Y坐标上的位置 | |
toYDelta | 动画结束时,Y坐标上的位置 | |
duration | 动画持续时间 | 长整型,以毫秒为单位 |
没有指定fromXType toXType fromYType toYType 时候,默认是以自己为相对参照物
在这些属性里面还可以加上%和p,例如:
android:toXDelta=”100%”,表示自身的100%,也就是从View自己的位置开始。
android:toXDelta=”80%p”,表示父层View的80%,是以它父层View为参照的。
旋转动画(rotate)
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" // 动画起始时物件的角度 android:toDegrees="+350" // 动画结束时物件旋转的角度 android:pivotX="50%" // 动画相对于物件的X坐标的开始位置 android:pivotY="50%" // 动画相对于物件的Y坐标的开始位置 android:duration="3000" // 动画持续时间 /> </set>
属性 | 含义 | 说明 |
---|---|---|
fromDegrees | 动画起始时物件的角度 | 当角度为负数——表示逆时针旋转, 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) |
toDegrees | 动画结束时物件旋转的角度,可以大于360度 | 同上 |
pivotX | 动画相对于物件的X坐标的开始位置 | 从0%-100%中取值, 50%为物件的X或Y方向坐标上的中点位置 |
pivotY | 动画相对于物件的Y坐标的开始位置 | 同上 |
使用XML中的动画
从资源文件中获取到Animation 的方法public static Animation loadAnimation (Context context, int id) //第一个参数Context为程序的上下文 //第二个参数id为动画XML文件的引用
示例:
Animation mAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action); //使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
JavaCode中定义动画
//在代码中定义 动画实例对象 private Animation myAnimation_Alpha; private Animation myAnimation_Scale; private Animation myAnimation_Translate; private Animation myAnimation_Rotate; //根据各自的构造方法来初始化一个实例对象 myAnimation_Alpha = new AlphaAnimation(0.1f, 1.0f); 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_Translate = new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); myAnimation_Rotate = new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
Android动画解析–JavaCode
AlphaAnimation① AlphaAnimation类对象定义
private AlphaAnimation myAnimation_Alpha
② AlphaAnimation类对象构造
AlphaAnimation(float fromAlpha, float toAlpha) //第一个参数fromAlpha为 动画开始时候透明度 //第二个参数toAlpha为 动画结束时候透明度 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); //说明: // 0.0表示完全透明 // 1.0表示完全不透明
③ 设置动画持续时间
myAnimation_Alpha.setDuration(5000); //设置时间持续时间为 5000毫秒
ScaleAnimation
① ScaleAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② ScaleAnimation类对象构造
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坐标上的伸缩尺寸 /*说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 */ //第五个参数pivotXType为动画在X轴相对于物件位置类型 //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置 //第七个参数pivotXType为动画在Y轴相对于物件位置类型 //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置 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毫秒
TranslateAnimation
① TranslateAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② TranslateAnimation类对象构造
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) //第一个参数fromXDelta为动画起始时 X坐标上的移动位置 //第二个参数toXDelta为动画结束时 X坐标上的移动位置 //第三个参数fromYDelta为动画起始时Y坐标上的移动位置 //第四个参数toYDelta为动画结束时Y坐标上的移动位置
③ 设置动画持续时间
myAnimation_Translate.setDuration(2000); //设置时间持续时间为 2000毫秒
RotateAnimation
① RotateAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② RotateAnimation类对象构造
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毫秒
使用Java代码中的动画效果
使用从View父类继承过来的方法startAnimation()来为View或是子类View等等添加一个动画效果public void startAnimation (Animation animation)
示例:
ImageView image = (ImageView) findViewById(R.id.image); Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); image.startAnimation(hyperspaceJump);
除了调用 startAnimation() ,另一种处理方式是通过Animation.setStartTime()方法定义一个开始时间,然后通过View.setAnimation()方法把这个动画赋给控件即可。
动画监听设置
如果你要监听动画的事件,如开始,结束等,你需要实现AnimationListener监听器,重写以下方法。onAnimationEnd(Animation animation) - 当动画结束时调用 onAnimationRepeat(Animation animation) - 当动画重复时调用 onAniamtionStart(Animation animation) - 当动画启动时调用
示例代码:
public class FadeInActivity extends Activity implements AnimationListener { TextView txtMessage; Button btnStart; Animation animFadein; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fadein); txtMessage = (TextView) findViewById(R.id.txtMessage); btnStart = (Button) findViewById(R.id.btnStart); // 加载动画 animFadein = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in); // 设置监听 animFadein.setAnimationListener(this); // 按钮 btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txtMessage.setVisibility(View.VISIBLE); // 开始动画 txtMessage.startAnimation(animFadein); } }); } @Override public void onAnimationEnd(Animation animation) { // 在动画结束后使用 // check for fade in animation if (animation == animFadein) { Toast.makeText(getApplicationContext(), "Animation Stopped", Toast.LENGTH_SHORT).show(); } } @Override public void onAnimationRepeat(Animation animation) { //当动画重复时使用 } @Override public void onAnimationStart(Animation animation) { //当动画开始使用 } }
参考文章:
http://www.jb51.net/article/39678.htm
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=564&_dsign=cd7f23f2
相关文章推荐
- Android5.0+(CollapsingToolbarLayout)
- Android应用程序如何获得系统签名权限01
- Android线程优先级设置方法技巧
- Android ListView 中的Adapter 优化 缓存 getContext()
- Android APK签名介绍02
- Android Studio导入外部library
- Android APK签名介绍01
- (转载)Android Volley完全解析,初识Volley的基本用法
- android下拉刷新和滑动到底部加载更多,自定义listview
- 解决Mac下Android SDK Manager联网失败的问题?
- android 源码开发 关于编译等小知识点总结
- Android安全攻防战,反编译与混淆技术完全解析(上)
- 关于Android Task的学习
- RxJava RxAndroid 资源收录
- 从源码分析Android的Volley库的工作流程
- 你造么,Android中程序的停止状态
- android绘图canvas.clipRect()方法的作用
- Android 性能测试之TraceView的使用
- can't rename root module
- android项目总结