【问题标题】:Android shared element transition animationAndroid共享元素过渡动画
【发布时间】:2020-06-13 05:01:13
【问题描述】:

我正在使用共享元素转换在整个活动中保持我的观点。我希望视图在更改活动时执行一些动画(例如翻转卡片)。

换句话说,除了基本的共享过渡(移动、缩放)之外,执行附加动画

这可能吗?

【问题讨论】:

    标签: android android-animation shared-element-transition


    【解决方案1】:

    可以通过自定义过渡来完成,例如对于翻转,可以通过以下方式完成:(用于更改活动内视图的ImageView,使用transitionDrawable 作为src)

    import android.animation.Animator
    import android.animation.AnimatorListenerAdapter
    import android.animation.AnimatorSet
    import android.animation.ObjectAnimator
    import android.content.Context
    import android.graphics.drawable.TransitionDrawable
    import android.transition.Transition
    import android.transition.TransitionValues
    import android.util.AttributeSet
    import android.view.View
    import android.view.ViewGroup
    import android.widget.ImageView
    
    class FlipTransition(ctx: Context, atts: AttributeSet): Transition(ctx, atts) {
    
        private val PROPNAME_DRAWABLE = "FlipTransition:drawable"
    
        private fun captureValues(transitionValues: TransitionValues) {
            val view = transitionValues.view
            if (view !is ImageView || view.getVisibility() != View.VISIBLE) {
                return
            }
            transitionValues.values[PROPNAME_DRAWABLE] = view.drawable
        }
    
        override fun captureStartValues(transitionValues: TransitionValues) {
           captureValues(transitionValues)
        }
    
        override fun captureEndValues(transitionValues: TransitionValues) {
            captureValues(transitionValues)
        }
    
        override fun createAnimator(
            sceneRoot: ViewGroup,
            startValues: TransitionValues?,
            endValues: TransitionValues?
        ): Animator? {
    
            if (startValues != null && endValues != null && endValues.view is ImageView) {
                val endView:ImageView = endValues.view as ImageView
                val startView:ImageView = startValues.view as ImageView
    
                val startAnim = ObjectAnimator.ofFloat(startView, "rotationY", 0F, 90F )
                startAnim.addListener(object: AnimatorListenerAdapter() {
                    override fun onAnimationEnd(animation: Animator?) {
                        startView.rotationY = 0F
                        (startView.drawable as TransitionDrawable).startTransition(300)
                    }
                })
    
                val endAnim = ObjectAnimator.ofFloat(endView, "rotationY", 270F, 360F )
                endAnim.addListener(object: AnimatorListenerAdapter() {
                    override fun onAnimationEnd(animation: Animator?) {
                        (startView.drawable as TransitionDrawable).reverseTransition(300)
                    }
                })
    
                return AnimatorSet().apply {
                    play(startAnim).before(endAnim)
                };
            }
    
            return null
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2016-02-04
      • 1970-01-01
      • 2016-04-23
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多