Android动画介绍

2019-04-24  本文已影响0人  瓶子狗坏人
Android动画

ViewAnimation

  1. Common: 共有的属性

    name description
    duration 动画的执行时间 , ms
    fillAfter 保持动画执行结束后的状态 , boolean
    fillBefore 恢复到动画执行前的状态 , boolean
    interpolator 插值器,动画执行的过程中的速率变化, 比如先快后慢、匀速等
    repeatMode 动画再次执行的模式: reverse, 逆向执行;restart,从头开始
    repeatCount 动画执行的次数: infinite(-1)表示无限循环,要在具体的Animation中设置才有效
  2. Alpha

    name description
    toAlpha 动画结束时的透明度, 0.0~1.0
    fromAlpha 动画开始时的透明度, 0.0~1.0
  1. Rotate

    name description
    pivotX 作为旋转中心的X的值,值有三种类型
    pivotY 作为旋转中心的Y的值,值有三种类型
    fromDegrees 动画开始时相较于原始位置所处的角度
    toDegrees 动画结束时相较于原始位置所处的角度, 值为负数时逆时针旋转, 值为正数时顺时针旋转
  2. Scale

    name description
    pivotX 作为动画起始点的X的值,值有三种类型
    pivotY 作为动画起始点Y的值,值有三种类型
    fromXScale 动画开始时X方向相较于原始大小的缩放比例
    toXScale 动画结束时X方向相较于原始大小的缩放比例
    fromYScale 动画开始时Y方向相较于原始大小的缩放比例
    toYScale 动画结束时Y方向相较于原始大小的缩放比例
  3. Translate

    name description
    fromXDelta 动画开始时相较于原始位置X平移的距离,值有三种类型
    toXDelta 动画结束时相较于原始位置X平移的距离,值有三种类型
    fromYDelta 动画开始时相较于原始位置Y平移的距离,值有三种类型
    toYDelta 动画结束时相较于原始位置X平移的距离,值有三种类型
  4. Set

    name description
    shareInterpolator Set动画集合中的动画是否共享插值器, boolean

DrawableAnimation(FrameAnimation)

//开始动画
(testV.drawable as? AnimationDrawable)?.start()

PropertyAnimation

  1. 属性动画不仅仅局限与View,它的作用在于改变目标对象的属性,目标对象不仅是View
  2. View动画只是改变了View的视觉效果,并没有改变View的属性;属性动画则改变了属性。
    如一个用了View动画位移到新位置的按钮,它的点击响应位置还是在原来的位置,本身的属性并没有改变。
    属性动画的点击响应位置则会在新位置(点击响应的位置坐标与组件的位置坐标不是同一个)。
  1. 普通用法
  1. 自定义
    对于一些没有的属性,可以通过装饰器模式来包装一下
//ShapeWrapper
class ShapeWrapper(private val target: View) {

    fun setShape(shape: ScaleShape) {
        target.layoutParams.apply {
            width = shape.x.toInt()
            height = shape.y.toInt()
        }
        target.requestLayout()
    }

    fun getShape(): ScaleShape {
        return ScaleShape(target.width.toFloat(), target.height.toFloat())
    }
}
//ScaleShape
data class ScaleShape(var x: Float, var y: Float)
//Evaluator
class ScaleShapeEvaluator : TypeEvaluator<ScaleShape> {
     override fun evaluate(fraction: Float, startValue: ScaleShape, endValue: ScaleShape): ScaleShape {
         val x = startValue.x + fraction * (endValue.x - startValue.x)
         val y = startValue.y + fraction * (endValue.y - startValue.y)

         return ScaleShape(x, y)
     }
}
//使用
val animator = ObjectAnimator.ofObject(
            ShapeWrapper(target),
            "shape",
            ScaleShapeEvaluator(),
            ScaleShape(100F, 100F),
            ScaleShape(500F, 500F)
        ).apply {
            repeatCount = ObjectAnimator.INFINITE
            repeatMode = ObjectAnimator.RESTART
            duration = 2000
            interpolator = LinearInterpolator()
        }

资源

例子

Android开发艺术探索 - 任玉刚

上一篇 下一篇

猜你喜欢

热点阅读