问题描述
我写了一个扩展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 (将#修改为@)