欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android动画使用方法总结

程序员文章站 2022-03-25 17:02:14
...

Android 中动画共三类,分别为:

  • 帧动画(Frame Animation)
  • 补间动画(Tween Animation)
  • 属性动画(Property Animation)

帧动画

<?xml version="1.0" encoding="utf-8"?>
<!--main_loading.xml-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/a01" android:duration="100" />
<item android:drawable="@drawable/a02" android:duration="100" />
... 省略...
<item android:drawable="@drawable/a08" android:duration="100" />
<item android:drawable="@drawable/a09" android:duration="100" />
</animation-list>

//Java 代码引用
AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.main_loading);
view.setBackground(animationDrawable);
animationDrawable.start();

使用场景
可以实现不规则轨迹动画,作用的对象没有事件要求。一般在加载条场景中应用。
注意事项
移动设备内存有限,图片是内存杀手,当我们在使用帧动画时,一定要控制图片质量,控制图片数量,谨慎编码,否则低内存设备有 OOM 风险。

补间动画

  • 透明度渐变 View
  • 位置移动 View
  • 旋转 View
  • 拉伸 View

补间动画没有真正的修改 View 属性,只是改变了视觉效果而已。

渐变动画

<?xml version="1.0" encoding="utf-8"?>
<!--ptr_alpha.xml-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="true"
android:fromAlpha="1.0"
android:toAlpha="0.1" />

//Java 代码引用
Animation anim = AnimationUtils.loadAnimation(context, R.anim.ptr_alpha); 
view.startAnimation(anim);

平移动画

<?xml version="1.0" encoding="utf-8"?>
<!--ptr_slide_in_from_bottom.xml-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0" />

//Java 代码中引用
Animation bottomToTop = AnimationUtils.loadAnimation(context, R.anim.ptr_slide_in_from_bottom);
view.startAnimation(bottomToTop);

旋转动画

<?xml version="1.0" encoding="utf-8"?>
<!--ptr_rotate.xml-->
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:toDegrees="360" />

//Java 代码中引用
Animation bottomToTop = AnimationUtils.loadAnimation(this, R.anim.ptr_rotate);
view.startAnimation(bottomToTop);

拉伸动画

<?xml version="1.0" encoding="utf-8"?>
<!--ptr_scale.xml-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="100%"
android:fromYScale="100%"
android:pivotY="50%"
android:pivotX="50%"
android:repeatCount="infinite"
android:toXScale="150%"
android:toYScale="150%" />

//Java 代表调用
Animation bottomToTop = AnimationUtils.loadAnimation(this, R.anim.ptr_scale);
view.startAnimation(bottomToTop);

使用场景
可以直接作用于 View,使用简单,只是视觉上有动画现象,没有真正修改 View 属性。使用此动画的同时无法响应点击事件,相对帧动画而言比较节省系统资源。
注意事项
点击事件无法与动画同时兼顾,无法实现复杂的动画效果。

属性动画

属性动画是 Android 3.0 后推出的 API,弥补了补间动画执行后其属性不变的问题,不再局限于 View,也不限定于只能实现移动、缩放、旋转和淡入淡出这几种动画操作。
更强大的是上面我们所说的按钮点击事件问题在属性动画上进行了完善、升级,最终展示给用户的不仅仅是视觉上的改变,同时动画对象的属性也进行了设置。如果我们通过属性动画来移动一个按钮,那么这个按钮是真正意义上的移动了,因为动画执行完毕后其所有属性会重新赋值。
下面我们看下属性动画中的两个 API

  • ValueAnimator
  • ObjectAnimator

ValueAnimator

ValueAnimator 是整个属性动画机制中很核心的一个类,其运行机制是通过不断地修改对象的值来实现动画。使用过程中我们只需要将初始值和结束值提供给 ValueAnimator ,并且告诉它动画所需运行的时长,那么 ValueAnimator 就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外 ValueAnimator 还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

ObjectAnimator

ObjectAnimator 作为 ValueAnimator 的子类,也就是说 ObjectAnimator 具有 ValueAnimator 类几乎所有的函数和属性。同时其内部封装了很多实用的方法,便于研发人员快速实现动画效果。事实证明项目中我们使用 ObjectAnimator 的比重的确偏大。