逐帧动画
通过在连续的帧之间快速切换来创建动画效果
var anim = animationView.background as AnimationDrawable
获取动画的Drawable资源anim.start()
启动动画anim.stop()
停止动画
private lateinit var animationView: ImageView
private var flag: Boolean = trueanimationView = findViewById(R.id.animationView)var anim = animationView.background as AnimationDrawableanimationView.setOnClickListener(View.OnClickListener {if (flag) {anim.start()//启动动画flag = false} else {anim.stop()//停止动画flag = true}})
放置图片的list
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/img" android:duration="200"/>
<item android:drawable="@drawable/img_1" android:duration="200"/>
<item android:drawable="@drawable/img_2" android:duration="200"/>
<item android:drawable="@drawable/img_3" android:duration="200"/>
<item android:drawable="@drawable/img_4" android:duration="200"/>
<item android:drawable="@drawable/img_5" android:duration="200"/>
<item android:drawable="@drawable/img_6" android:duration="200"/>
</animation-list>
补间动画
使用中间帧来平滑地改变一个属性(例如位置、大小等)
- alpha 透明度
android:fromAlpha="0"
开始的透明度android:toAlpha="1"
结束的透明度android:duration="2000"
透明度变化的周期
设置
iv=findViewById(R.id.iv)iv.setOnClickListener(View.OnClickListener {//通过加载xml动画设置文件创建一个animation对象var annotationView = AnimationUtils.loadAnimation(this,R.anim.alpha)iv.startAnimation(annotationView)})
- rotate 旋转
android:fromDegrees="0"
开始旋转的角度android:toDegrees="360"
结束旋转的角度android:pivotX="50%"
X轴旋转位置android:pivotY="50%"
Y轴旋转位置android:duration="3000"
旋转周期
设置
iv=findViewById(R.id.iv)iv.setOnClickListener(View.OnClickListener {//通过加载xml动画设置文件创建一个animation对象
var annotationView = AnimationUtils.loadAnimation(this,R.anim.rotate)
iv.startAnimation(annotationView)
- scale 缩放
android:fromXScale="1"
未开始缩放之前的X轴大小android:fromYScale="1"
未开始缩放之前的Y轴大小android:toXScale="0.5"
缩放之后的X轴大小android:toYScale="0.5"
缩放之后的Y轴大小android:pivotX="50%"
X轴缩放位置android:pivotY="50%"
Y轴缩放位置android:duration="3000"
缩放周期
设置
iv=findViewById(R.id.iv)iv.setOnClickListener(View.OnClickListener {//通过加载xml动画设置文件创建一个animation对象var annotationView = AnimationUtils.loadAnimation(this,R.anim.scale)iv.startAnimation(annotationView)})
- translate 平移
android:fromXDelta="0"
未开始平移之前的X轴大小android:fromYDelta="0"
未开始平移之前的Y轴大小android:toXDelta="400"
平移之后的X轴大小android:toYDelta="400"
平移之后的Y轴大小android:duration="3000"
旋转周期
设置
iv=findViewById(R.id.iv)iv.setOnClickListener(View.OnClickListener {//通过加载xml动画设置文件创建一个animation对象var annotationView = AnimationUtils.loadAnimation(this,R.anim.translate)iv.startAnimation(annotationView)})
属性动画
在给定时间段内平滑地改变一个或多个属性值的动画
ValueAnimator 使用
iv = findViewById(R.id.iv)//创建了一个新的ValueAnimator实例,并指定了动画应该从0开始到1结束var animator = ValueAnimator.ofFloat(0f, 1f)animator.setDuration(3000)//设置周期//在动画的每一次更新时调用animator.addUpdateListener(ValueAnimator.AnimatorUpdateListener {//获取当前动画的值,并将其转换为浮点数var value = it.animatedValue as FloatLog.e("MainActivity2", "onAnimationUpdate:" + value)})//启动动画animator.start()
ObjectAnimator 使用
//创建ObjectAnimator实例,实例改变iv的ImageView的透明度。动画从完全透明(0f)开始,到完全不透明(1f)结束var objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 0f, 1f)//设置动画周期objectAnimator.duration = 3000objectAnimator.start()//动画监听器,在动画的不同阶段调用特定的方法objectAnimator.addListener(object : Animator.AnimatorListener {//动画开始时调用override fun onAnimationStart(p0: Animator) {Log.e(TAG, "动画开始")}//动画结束时调用override fun onAnimationEnd(p0: Animator) {Log.e(TAG, "动画结束")}//动画被取消时调用override fun onAnimationCancel(p0: Animator) {Log.e(TAG, "动画被取消")}//动画重复时调用override fun onAnimationRepeat(p0: Animator) {Log.e(TAG, "动画重复")}})//另一种添加监听器的方式,仅重写需要的方法objectAnimator.addListener(object : AnimatorListenerAdapter() {override fun onAnimationStart(animation: Animator, isReverse: Boolean) {super.onAnimationStart(animation, isReverse)}})