当前位置:首页 > 行业动态 > 正文

安卓动画实现

安卓动画主要通过补间动画(如Alpha/Scale/Translate/Rotate)、帧动画(逐帧绘制)和属性动画(ObjectAnimator/ValueAnimator)实现, 补间动画通过XML或代码控制视图渐变, 属性动画可动态修改属性值并支持插值器、监听器,灵活性

常见动画类型及适用场景

动画类型 原理 适用场景
补间动画 通过 Animation 类控制视图的位移、缩放、旋转、透明度 简单视图变换(如平移按钮、渐隐渐现)
属性动画 基于 ObjectAnimatorAnimatorSet 直接修改属性值 复杂属性变化(如动态调整颜色、尺寸、位置)
矢量动画 使用 AnimatedVectorDrawable 控制矢量图形的路径变化 图标变形(如箭头变爱心)、复杂图形过渡
帧动画 按顺序播放预定义的多张图片(Drawable 逐帧动画(如加载进度条、GIF 效果)
过渡动画 通过 TransitionManager 实现多个视图之间的状态切换 界面跳转时的共享元素动画、RecyclerView Item 变化

核心动画实现方式

补间动画(Tween Animation)

  • 步骤
    1. res/anim 目录下创建 .xml 文件定义动画(如 scale.xml)。
    2. 在代码中通过 AnimationUtils.loadAnimation() 加载动画。
    3. 调用 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)

  • 步骤
    1. 使用 ObjectAnimatorValueAnimator 创建动画对象。
    2. 设置目标属性(如 alphatranslationX)和数值范围。
    3. 调用 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)

  • 步骤
    1. res/drawable 中定义 animated-vector 文件(如 avd_arrow_to_heart.xml)。
    2. 在布局中引用 <animated-vector>
    3. 通过 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"
动画中断异常 ActivityFragment 销毁时调用 animator.cancel()
低版本兼容性 使用 AnimatorListener 替代 doOnEnd,避免 API 21+ 限制
布局抖动 对动画目标视图启用 layerType(如 LAYER_TYPE_HARDWARE

常见问题与解答

Q1:如何优化属性动画的性能?

A

  1. 减少视图层级:动画目标视图尽量扁平化。
  2. 启用硬件加速:在 AndroidManifest.xml 中设置 android:hardwareAccelerated="true"
  3. 复用动画对象:避免频繁创建 ObjectAnimator,可复用已有实例。
  4. 降低动画复杂度:减少同时运行的动画数量,简化插值器(Interpolator)。

Q2:如何在动画中动态改变目标属性?

A

  1. 使用 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()
  2. 自定义 TypeEvaluator:处理非浮点型属性(如颜色、路径)。
    val colorAnim = ObjectAnimator.ofObject(
        view,
        "backgroundColor",
        ArgbEvaluator(),
        Color.RED, Color.BLUE
    )
    colorAnim.start()

原创文章,作者:未希,如若转载,请注明出处:https://www.xixizhuji.com/ask/1741348.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

0