动画应该是很基础的东西了, 但是由于自己的记性不太好, 总是记不住那些参数和方法, 只是知道怎么用而已所以每次用的时候都去百度或者 Google 属性动画的属性确实有点多, 这次终于鼓足了勇气作一个总结, 让动画的种种用法彻底地记在脑子里面
动画分类:
动画分为帧动画 (Frame Animation) 补间动画 (Tweened Animation) 和属性动画
帧动画
帧动画就像放电影一样, 连续播放一张张的图片形成动画
在 drawable 文件夹下创建一个 animlist.xml 文件, 内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@mipmap/mike_volume_part1" android:duration="150"></item>
- <item android:drawable="@mipmap/mike_volume_part2" android:duration="150"></item>
- <item android:drawable="@mipmap/mike_volume_part3" android:duration="150"></item>
- <item android:drawable="@mipmap/mike_volume_part4" android:duration="150"></item>
- </animation-list>
动画的每一帧 150 毫秒, 一共 4 帧 oneshot 表示是否重复播放
播放帧动画
- ivFrame.setImageResource(R.drawable.animlist);
- AnimationDrawable drawable = (AnimationDrawable) ivFrame.getDrawable();
- drawable.start(); // 开始
- //drawable.stop(); // 结束
演示效果:
giphy (1).gif
补间动画
XML 配置中属性名:
alpha 透明度动画
scale 缩放动画
translate 移动动画
rotate 旋转动画
代码中动画类名:
AlphaAnimation 透明度动画
ScaleAnimation 缩放动画
TranslateAnimation 移动动画
RotateAnimation 旋转动画
Alpha 属性值说明
fromAlpha 起始时透明度, 范围 0-1
toAlpha 结束时透明度, 范围 0-1
Scale 属性值说明
fromXScale 起始时 X 轴上的缩放比例
toXScale 结束时 X 轴上的缩放比例
fromYScale 起始时 Y 轴上的缩放比例
toYScale 结束时 Y 轴上的缩放比例
pivotX 缩放中心点 X 坐标位置
pivotY 缩放中心点 Y 坐标位置
Translate 属性值说明
fromXDelta 起始时动画在 X 坐标的位置
toXDelta 结束时动画在 X 坐标的位置
fromYDelta 起始时动画在 Y 坐标的位置
toYDelta 结束时动画在 Y 坐标的位置
Rotate 属性值说明
fromDegrees 起始时控件角度
toDegrees 结束时控件角度
pivotX 旋转中心点 X 坐标位置
pivotY 旋转中心点 Y 坐标位置
属性:
fillAfter 为 ture 时, 该动画结束后保持结束时的状态
interpolator 设置动画插值器
duration 设置动画持续时间
startOffset 动画在几秒开始执行
将以上各个动画类型办个组合来举个栗子:
在 anim 文件夹下创建了 animset.xml 文件, 内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="2000"/>
- <rotate android:fromDegrees="0" android:toDegrees="720" android:pivotX="50%" android:pivotY="50%" android:duration="2000"/>
- <scale android:fromXScale="1" android:toXScale="2" android:fromYScale="1" android:toYScale="2"
- android:pivotY="50%" android:pivotX="50%" android:duration="2000"/>
- <translate android:fromXDelta="0" android:toXDelta="300" android:fromYDelta="0" android:toYDelta="300" android:duration="2000"/>
- </set>
加载该动画方式:
- Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.animset);
- animation.setFillAfter(true);
- ivTween.startAnimation(animation);
演示效果:
giphy (2).gif
属性动画: ObjectAnimator 用法
调用方法:
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
第一个参数用于指定这个动画要操作的是哪个控件
第二个参数用于指定这个动画要操作这个控件的哪个属性
第三个参数是可变长参数, 这个就跟 ValueAnimator 中的可变长参数的意义一样了, 用于设置属性的变化过程
任性一下, 这么多字符串, 我怎么知道有哪些属性啊?! 如果写错了呢?
1 透明度: alpha
public void setAlpha(float alpha)
2 旋转度数: rotationrotationXrotationY
- public void setRotation(float rotation)
- public void setRotationX(float rotationX)
- public void setRotationY(float rotationY)
3 平移: translationXtranslationY
- public void setTranslationX(float translationX)
- public void setTranslationY(float translationY)
4 缩放: scaleXscaleY
- public void setScaleX(float scaleX)
- public void setScaleY(float scaleY)
多个属性动画调用:
- private void valueAnim(){
- ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(ivTween,"alpha",0,1);
- objectAnimator.setDuration(2000);
- objectAnimator.start();
- ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(ivTween,"scaleX",1,2);
- objectAnimator1.setDuration(2000);
- objectAnimator1.start();
- ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(ivTween,"scaleY",1,2);
- objectAnimator2.setDuration(2000);
- objectAnimator2.start();
- ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(ivTween,"rotation",0,360);
- objectAnimator3.setDuration(2000);
- objectAnimator3.start();
- }
演示效果:
giphy (3).gif
动画监听器:
AnimatorListener, 用于监听动画执行的过程 AnimatorUpdateListener, 用于监听动画执行过程中的值变化
- objectAnimator.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- // 动画开始时调用
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- // 动画结束时调用
- }
- @Override
- public void onAnimationCancel(Animator animation) {
- // 动画取消时调用
- }
- @Override
- public void onAnimationRepeat(Animator animation) {
- // 动画重复执行时调用
- }
- });
- // 动画执行过程中不断执行, 可以获取得到当前动画执行的值
- objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- }
- });
github 代码地址 https://github.com/18380438200/AndroidAnimation
来源: http://www.jianshu.com/p/eddae5939f8c