gpt4 book ai didi

java - 通用动画叠加层的 View 枢轴不起作用

转载 作者:行者123 更新时间:2023-12-02 12:46:30 25 4
gpt4 key购买 nike

我目前正在尝试为动画叠加制作通用方法。这样工作:将 Activity 作为参数传递->方法将所需的 View 附加到Activity的rootview上,使其无效并在这种情况下开始旋转动画。但是,动画的枢轴不适用于正确的 View ,除此以外,其他所有方法都可以正常工作,因此它只是从View的X和Y旋转,这是不正确的。

方法:

fun createLoading(activity: Activity, activityWidth: Int): Animation {
val loadingAnimation = AnimationUtils.loadAnimation(activity, R.anim.animation_loading_rotate)

val parent = activity.window.decorView.findViewById<ViewGroup>(android.R.id.content)

val loadingBg = ImageView(activity)

loadingBg.tag = "customLoadingBg"
loadingBg.layoutParams = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT)
loadingBg.visibility = View.VISIBLE
loadingBg.setImageResource(R.drawable.darken_background)

val loadingImage = ImageView(activity)

loadingImage.tag = "customLoadingImage"
loadingImage.setImageResource(R.drawable.icon_web)
loadingImage.visibility = View.VISIBLE
loadingImage.layoutParams = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT) //TODO pivot doesn't work. Again...
loadingImage.layoutParams.width = (activityWidth * 0.1).toInt()
loadingImage.layoutParams.height = (activityWidth * 0.1).toInt()
loadingImage.pivotX = (activityWidth * 0.05).toFloat()
loadingImage.pivotY = (activityWidth * 0.05).toFloat()

loadingImage.x = ((activityWidth / 2 - (activityWidth * 0.1 / 2).toInt()).toFloat())
loadingImage.y = 0f

parent.addView(loadingBg)
parent.addView(loadingImage)

loadingAnimation!!.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
}

override fun onAnimationEnd(animation: Animation?) {
parent.removeView(parent.findViewWithTag<ImageView>("customLoadingImage"))
parent.removeView(parent.findViewWithTag<FrameLayout>("customLoadingBg"))
}

override fun onAnimationStart(animation: Animation?) {
loadingBg.alpha = 0.5f
loadingImage.pivotX = (activityWidth * 0.05).toFloat()
loadingImage.pivotY = (activityWidth * 0.05).toFloat()
Log.d("loadingimg_pivotX", loadingImage.pivotX.toString())
loadingBg.bringToFront()
loadingImage.bringToFront()
}
})

loadingImage.post {
activity.runOnUiThread {
parent.invalidate()
parent.getChildAt(parent.childCount - 1).startAnimation(loadingAnimation)
}
}

return loadingAnimation
}

如您所见,我什至尝试将其放入动画的onAnimationStart方法中,但不起作用。
我什至尝试使用预定义的XML动画并将其应用于 View ,但是这些都不适合我。
欣赏任何想法。

编辑:
R.anim.animation_loading_rotate的声明
android:duration="750"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:toDegrees="360"

最佳答案

最好有样本,可以在本地检查。我不确定在此示例中您在谈论哪个枢轴。在我们的情况下,相对于动画下的 View ,数据透视表应为,而不是父级。因此,在我们的情况下,如果轮换使用,则下一步将是正确的更改。

loadingImage.pivotX = (loadingImage.getWidth() * 0.5).toFloat()
loadingImage.pivotY = (loadingImage.getHeight() * 0.5).toFloat()

最后一点,我强烈建议您坚持使用Android Property Animation而不是View Animation。您只需将示例替换为ObjectAnimator,可能就可以解决您的问题。因为ObjectAnimator不仅可以动画,而且可以导航View更改,因此简单的View动画只是重绘对象。检查更多细节from the documentation

关于java - 通用动画叠加层的 View 枢轴不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com