首页 > 其他 > 详细

自定义控件开发入门与实战(第3章 属性动画)

时间:2020-06-18 14:12:26      阅读:59      评论:0      收藏:0      [点我收藏+]

第三章 属性动画

  1. ValueAnimator实战

    // 属性值从0变化到400
    val valueAnimator = ValueAnimator.ofInt(0, 400)
    valueAnimator.duration = 1000
    valueAnimator.start()
    // 添加监听器
    valueAnimator.addUpdateListener { animation ->
       val animatedValue = animation.animatedValue as Int
       img.layout(animatedValue, animatedValue, animatedValue + img.width, animatedValue + img.height)
    }
  2. 自定义插值器与Evaluator

    1. 自定义插值器

      valueAnimator.interpolator = Interpolator { input ->
         // input代表动画时间内的进度,从0-1匀速变化,此时变化是平方级变化
         // 取值可以小于0或者大于1,可以参考AnticipateOvershootInterpolator
         input * input }
    2. Evaluator

      技术分享图片

      valueAnimator.setEvaluator { fraction, startValue, endValue -> 
          // fraction 代表
          fraction * (startValue as Int - endValue as Int) + endValue
      }
    3. ValueAnimator进阶——ofObject

      // 自定义Evaluator
      val evaluator : TypeEvaluator<Char> = TypeEvaluator { fraction, startValue, endValue ->
         val fl = startValue.toInt() + fraction * (endValue.toInt() - startValue.toInt())
         fl.toChar()
      }
      ?
      // 需要传入自定义Evaluator,告知动画执行过程中的值
      val ofObjectAnim = ValueAnimator.ofObject(evaluator, ‘A‘, ‘z‘)
      ofObjectAnim.start()
      ofObjectAnim.addUpdateListener { animation ->
         charTv.setText(animation.getAnimatedValue().toString())
      }
  3. ObjectAnimator

    val arrayOf = arrayOf("alpha", "rotation", "rotationX", "rotationY", "scaleX", "scaleY")
    // 通过反射
    objAnim = ObjectAnimator.ofFloat(image, arrayOf[animCount], 0f, 300f)
  4. 组合动画——AnimatorSet

    1. playSequentially() 依次播放

      val animatorSet = AnimatorSet()
      animatorSet.playSequentially(objAnim, objAnim)
    2. playTogether() 同时播放

      val animatorSet = AnimatorSet()
      animatorSet.playTogether(objAnim, objAnim)
    3. AnimatorSet.Builder

      1. 同时播放动画

        val animatorSet = AnimatorSet()
        val builder = animatorSet.play(objAnim)
        builder.with(objAnim)
      2. 其他函数

        before
        after
        都是以play()中当前所播放的动画为基准的
  5. Animator动画的XML实现

    1. ValueAnimator的XML实现

      1. 定义XML文件

        <animator xmlns:android="http://schemas.android.com/apk/res/android"
           android:duration="1000"
           android:valueFrom="0"
           android:valueTo="300"
           android:startOffset="1000"
           android:repeatCount="infinite"
           android:repeatMode="reverse"
           android:valueType="intType"
           android:interpolator="@android:anim/anticipate_overshoot_interpolator"/>
      2. 代码中执行

        val loadAnimator = AnimatorInflater.loadAnimator(this, R.animator.animator) as ValueAnimator
        loadAnimator.addUpdateListener { animation ->
        val offset = animation.getAnimatedValue() as Int
        image.layout(offset, offset, image.width + offset, image.height + offset)
        }
        loadAnimator.start()
    2. ObjectAnimator的XML实现

      1. 定义XML文件

        <?xml version="1.0" encoding="utf-8"?>
        <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
           android:propertyName="TranslationY"
           android:duration="1000"
           android:valueFrom="0f"
           android:valueTo="400f"
           android:valueType="floatType"
           android:startOffset="500"
           android:repeatMode="reverse"
           android:repeatCount="infinite"
           android:interpolator="@android:anim/anticipate_overshoot_interpolator"/>

         

      2. 代码中执行

        val objectAnimator =
                   AnimatorInflater.loadAnimator(this, R.animator.obj_animator) as ObjectAnimator
        ?
        objectAnimator.target = image
        objectAnimator.start()

自定义控件开发入门与实战(第3章 属性动画)

原文:https://www.cnblogs.com/youngly15/p/13157156.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!