上一篇
安卓动画实现
- 行业动态
- 2025-04-24
- 3799
安卓动画主要通过补间动画(如Alpha/Scale/Translate/Rotate)、帧动画(逐帧绘制)和属性动画(ObjectAnimator/ValueAnimator)实现, 补间动画通过XML或代码控制视图渐变, 属性动画可动态修改属性值并支持插值器、监听器,灵活性
常见动画类型及适用场景
动画类型 | 原理 | 适用场景 |
---|---|---|
补间动画 | 通过 Animation 类控制视图的位移、缩放、旋转、透明度 | 简单视图变换(如平移按钮、渐隐渐现) |
属性动画 | 基于 ObjectAnimator 或 AnimatorSet 直接修改属性值 | 复杂属性变化(如动态调整颜色、尺寸、位置) |
矢量动画 | 使用 AnimatedVectorDrawable 控制矢量图形的路径变化 | 图标变形(如箭头变爱心)、复杂图形过渡 |
帧动画 | 按顺序播放预定义的多张图片(Drawable ) | 逐帧动画(如加载进度条、GIF 效果) |
过渡动画 | 通过 TransitionManager 实现多个视图之间的状态切换 | 界面跳转时的共享元素动画、RecyclerView Item 变化 |
核心动画实现方式
补间动画(Tween Animation)
- 步骤:
- 在
res/anim
目录下创建.xml
文件定义动画(如scale.xml
)。 - 在代码中通过
AnimationUtils.loadAnimation()
加载动画。 - 调用
view.startAnimation(animation)
启动动画。
- 在
- 示例(缩放按钮):
<!-res/anim/scale.xml --> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:fromXScale="0.5" android:toXScale="1.0" android:fromYScale="0.5" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:duration="300"/>
val animation = AnimationUtils.loadAnimation(this, R.anim.scale) button.startAnimation(animation)
属性动画(Property Animation)
- 步骤:
- 使用
ObjectAnimator
或ValueAnimator
创建动画对象。 - 设置目标属性(如
alpha
、translationX
)和数值范围。 - 调用
start()
执行动画。
- 使用
- 示例(旋转+透明度组合动画):
val rotateAnim = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f) val alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f, 1f) val animSet = AnimatorSet().apply { playTogether(rotateAnim, alphaAnim) duration = 1000 } animSet.start()
矢量动画(Vector Drawable Animation)
- 步骤:
- 在
res/drawable
中定义animated-vector
文件(如avd_arrow_to_heart.xml
)。 - 在布局中引用
<animated-vector>
通过
AnimatorInflater
或代码控制动画。
- 在
示例(箭头变爱心):
<!-res/drawable/avd_arrow_to_heart.xml --> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_arrow"> <target android:name="path_group" android:animationList="@anim/path_morph"/> </animated-vector>
关键注意事项
问题 | 解决方案 |
---|---|
性能卡顿 | 避免在动画中执行复杂计算,使用硬件加速(android:hardwareAccelerated="true" ) |
动画中断异常 | 在 Activity 或 Fragment 销毁时调用 animator.cancel() |
低版本兼容性 | 使用 AnimatorListener 替代 doOnEnd ,避免 API 21+ 限制 |
布局抖动 | 对动画目标视图启用 layerType (如 LAYER_TYPE_HARDWARE ) |
常见问题与解答
Q1:如何优化属性动画的性能?
A:
减少视图层级:动画目标视图尽量扁平化。
启用硬件加速:在
AndroidManifest.xml
中设置android:hardwareAccelerated="true"
。复用动画对象:避免频繁创建
ObjectAnimator
,可复用已有实例。降低动画复杂度:减少同时运行的动画数量,简化插值器(Interpolator)。
Q2:如何在动画中动态改变目标属性?
A:
使用
Keyframe
:通过Keyframe
定义不同时间段的属性值。val anim = ObjectAnimator.ofPropertyValuesHolder( view, PropertyValuesHolder.ofFloat("translationX", 0f, 100f, 0f), PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f, 1f) ) anim.duration = 2000 anim.start()
自定义
TypeEvaluator
:处理非浮点型属性(如颜色、路径)。val colorAnim = ObjectAnimator.ofObject( view, "backgroundColor", ArgbEvaluator(), Color.RED, Color.BLUE ) colorAnim.start()
原创文章,作者:未希,如若转载,请注明出处:https://www.xixizhuji.com/ask/1741348.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。