在“过渡”中,当发生片段共享元素过渡时,有时不会调用captureEndValues,而endValues返回null吗?

问题描述

我写了一个扩展androidx.transition.Transtion的转换,该转换将视图从起始值旋转到结束值,这只是一个示例,它发生在其他扩展Transition的类中。

如果我使用TransitionManager.beginDelayedTransition()(如果我使用起始值和结束值而不是endTransitionValues作为参数),则效果很好。

class CustomrotationTransition : Transition {

    private var startRotation: Float = 0f
    private var endRotation: Float = 0f
    var forceValues: Boolean = false

    constructor(startRotation: Float,endRotation: Float,forceValues: Boolean=false) {
        this.startRotation = startRotation
        this.endRotation = endRotation
        this.forceValues = forceValues
    }

    constructor(context: Context,attrs: AttributeSet) : super(context,attrs) {

        val a = context.obtainStyledAttributes(attrs,R.styleable.CustomrotationTransition)
        startRotation =
            a.getFloat(R.styleable.CustomrotationTransition_startRotation,startRotation)
        endRotation = a.getFloat(R.styleable.CustomrotationTransition_startRotation,endRotation)
        a.recycle()

    }

    override fun captureStartValues(transitionValues: TransitionValues) {
        if (forceValues) {
            transitionValues.values[PROPNAME_ROTATION] = startRotation
        } else {
            captureValues(transitionValues)
        }
        println("⚠️ ${this::class.java.simpleName} captureStartValues() view: ${transitionValues.view} ")
        transitionValues.values.forEach { (key,value) ->
            println("Key: $key,value: $value")
        }
    }

    override fun captureEndValues(transitionValues: TransitionValues) {
        if (forceValues) {
            transitionValues.values[PROPNAME_ROTATION] = endRotation
        } else {
            captureValues(transitionValues)
        }
        println("? ${this::class.java.simpleName}  captureEndValues() view: ${transitionValues.view} ")
        transitionValues.values.forEach { (key,value: $value")
        }
    }

    private fun captureValues(transitionValues: TransitionValues) {
        transitionValues.values[PROPNAME_ROTATION] = transitionValues.view.rotation
    }

    override fun createAnimator(
        sceneRoot: ViewGroup,startValues: TransitionValues?,endValues: TransitionValues?
    ): Animator? {

        println("? ${this::class.java.simpleName}  createAnimator() startValues: $startValues endValues: $endValues ")

        if (endValues == null || startValues == null) return null // no values

        val startRotation = startValues.values[PROPNAME_ROTATION] as Float
        val endRotation = endValues.values[PROPNAME_ROTATION] as Float

        if (startRotation == endRotation) return null // no rotation to run

        val view = startValues.view

        val propRotation =
            PropertyValuesHolder.ofFloat(PROPNAME_ROTATION,startRotation,endRotation)

        val valAnim = ValueAnimator.ofPropertyValuesHolder(propRotation)
        valAnim.addUpdateListener { valueAnimator ->
            view.pivotX = view.width / 2f
            view.pivotY = view.height / 2f
            view.rotation = valueAnimator.getAnimatedValue(PROPNAME_ROTATION) as Float
        }
        return valAnim
    }

    companion object {
        private const val PROPNAME_ROTATION = "PROPNAME_ROTATION"
    }
}

例如,当我为视图上的退出过渡设置此过渡时,例如片段过渡时,还会有一个图像用于共享过渡,其他过渡也可以工作。

val slide = Slide(Gravity.TOP)
    .apply {
        duration = 3000
    }
val transitionSet = TransitionSet()

val textTransition =
    CustomrotationTransition(-360f,0f,true)
        .apply {
            addTarget(tvExitTransition)
            duration = 800
        }

transitionSet.addTransition(slide)
transitionSet.addTransition(textTransition)

exitTransition = transitionSet


I: ⚠️ CustomrotationTransition captureStartValues() view: com.google.android.material.textview.MaterialTextView{ee699a0 V.ED..... ........ 79,1544-213,1598 #7f08018c app:id/tvExitTransition} 
I: Key: PROPNAME_ROTATION,value: -360.0


I: ? CustomrotationTransition  createAnimator() startValues: TransitionValues@5e18b379:
I:     view = com.google.android.material.textview.MaterialTextView{ee699a0 V.ED..... ........ 79,1598 #7f08018c app:id/tvExitTransition}
I:     values:    android:visibilityPropagation:center: [I@e8877ad
I:     android:visibilityPropagation:visibility: 0
I:     PROPNAME_ROTATION: -360.0
I:  endValues: null 

我看到未调用captureEndValues,我真的不明白为什么不调用

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)