美文网首页
Android动画之属性动画

Android动画之属性动画

作者: 王灵 | 来源:发表于2021-04-08 00:33 被阅读0次

没有找到比较官方的定义,所以这是我对它的理解:随着时间来不断修改属性的值,以实现动画的效果

  • ViewPropertyAnimator

最简单的属性动画,当然功能也很简单。只有位移、缩放、透明度、旋转等

        iv_dayu.animate()
            //设置属性
            .translationX(200.dp)
            .translationY(200.dp)
            .alpha(0.5f)
            .scaleX(2f)
            .scaleY(0.5f)
            .rotation(90f)
            //设置插值器
            .setInterpolator(LinearOutSlowInInterpolator())
            //设置延迟时间
            .setStartDelay(1000)
            //设置持续时间
            .duration = 5000
  • ObjectAnimator

相比于ViewPropertyAnimator,它可以为自定义属性设置动画

class MyImageView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    val paint = Paint(Paint.ANTI_ALIAS_FLAG)

    var imageWidth: Float = 50.dp
        set(value) {
            field = value
            invalidate()
        }
    var startX = 0f
        set(value) {
            field = value
            invalidate()
        }
    var startY = 0f
        set(value) {
            field = value
            invalidate()
        }


    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        val img = getAvatar(imageWidth, R.drawable.dayu1)
        canvas.drawBitmap(img, startX, startY, paint)
    }

}

修改自定义viewMyImageView的图片宽度imageWidth

        val objectAnnotation = ObjectAnimator.ofFloat(my_image, "imageWidth", 50.dp, 300.dp)
        objectAnnotation.startDelay = 1000
        objectAnnotation.duration = 2000
        objectAnnotation.start()
  • PropertyValuesHolder

设置更加详细的动画,可以同时改变一个view的多个属性,也可以对一个属性在多个阶段进行设置。

        val bottomFlipHolder = PropertyValuesHolder.ofFloat("bottomFlip", 60f)
        val flipRotationHolder = PropertyValuesHolder.ofFloat("flipRotation", 270f)
        val topFlipHolder = PropertyValuesHolder.ofFloat("topFlip", -60f)

        val holderAnimator = ObjectAnimator.ofPropertyValuesHolder(
            camera_view,
            bottomFlipHolder,
            flipRotationHolder,
            topFlipHolder
        )
        holderAnimator.startDelay = 1000
        holderAnimator.duration = 2000
        holderAnimator.start()
        val keyframe = Keyframe.ofFloat(0.2f, 20f)
        val keyframe2 = Keyframe.ofFloat(0.5f, 60f)
        val keyframe3 = Keyframe.ofFloat(0.8f, 30f)
        val holder = PropertyValuesHolder.ofKeyframe("bottomFlip", keyframe, keyframe2, keyframe3)

        val objectAnimator = ObjectAnimator.ofPropertyValuesHolder(camera_view, holder)

        objectAnimator.startDelay = 1000
        objectAnimator.duration = 2000
        objectAnimator.start()
  • AnimatorSet

将多个Animator合并在一起,以顺序或并行的方式进行

        val topFlipAnimator = ObjectAnimator.ofFloat(camera_view, "topFlip", -60f)
        topFlipAnimator.startDelay = 200
        topFlipAnimator.duration = 1000
//        topFlipAnimator.start()

        val bottomFlipAnimator = ObjectAnimator.ofFloat(camera_view, "bottomFlip", 60f)
        bottomFlipAnimator.startDelay = 1000
        bottomFlipAnimator.duration = 1000
//        bottomFlipAnimator.start()

        val flipRotationAnimator = ObjectAnimator.ofFloat(camera_view, "flipRotation", 270f)
        flipRotationAnimator.startDelay = 200
        flipRotationAnimator.duration = 1000
//        flipRotationAnimator.start()

        //顺序执行多个属性
        val animatorSet = AnimatorSet()
        animatorSet.playSequentially(bottomFlipAnimator, flipRotationAnimator, topFlipAnimator)
        //animatorSet.playTogether(bottomFlipAnimator, flipRotationAnimator, topFlipAnimator)
        animatorSet.start()
  • Interpolator

插值器,用于设置时间完成度和动画完成度的计算公式
animator.interpolator=LinearInterpolator()

  • TypeEvaluator

用于设置动画完成度到属性具体值的计算公式。比如argb颜色就不能简单的进行数值的简单增长
animator.setEvaluator(ArgbEvaluator())
也可以进行自定义

  //对一个PointF 坐标进行运输
public class HsvEvaluator implements TypeEvaluator<Integer> {
     @Override
     public Object evaluate(float fraction, Object startValue, Object endValue) {
                val startX = startValue.x
                val startY = startValue.y
                val endX = endValue.x
                val endY = endValue.y
                val currentX = startX + (endX - startX) * fraction
                val currentY = startY + (endY - startY) * fraction
                PointF(currentX, currentY)
     }
}

更多知识:
https://blog.csdn.net/carson_ho/article/details/72909894
https://www.jianshu.com/p/b117c974deaf

相关文章

网友评论

      本文标题:Android动画之属性动画

      本文链接:https://www.haomeiwen.com/subject/zlpukltx.html