Java 视图';通用动画覆盖的s轴不工作
我目前正在尝试为动画叠加制作一个通用方法。工作方式如下:将活动作为参数传递->方法将所需视图附加到活动的根视图上,使其无效,并在本例中启动旋转动画。然而,动画的轴心并没有正确地应用于视图,除此之外一切都正常,所以它只是从视图的X和Y旋转,这是不正确的 方法:Java 视图';通用动画覆盖的s轴不工作,java,android,kotlin,Java,Android,Kotlin,我目前正在尝试为动画叠加制作一个通用方法。工作方式如下:将活动作为参数传递->方法将所需视图附加到活动的根视图上,使其无效,并在本例中启动旋转动画。然而,动画的轴心并没有正确地应用于视图,除此之外一切都正常,所以它只是从视图的X和Y旋转,这是不正确的 方法: fun createLoading(activity: Activity, activityWidth: Int): Animation { val loadingAnimation = AnimationUtils.loadAni
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
}
最好有样品,在当地检查一下。我不确定,您在本示例中谈论的是哪个轴心。在我们的例子中,轴应该相对于动画下的视图,而不是父视图。所以在我们的例子中,如果是旋转,下一步就是正确的改变
loadingImage.pivotX = (loadingImage.getWidth() * 0.5).toFloat()
loadingImage.pivotY = (loadingImage.getHeight() * 0.5).toFloat()
最后一点,我强烈建议坚持使用Android
属性动画
而不是查看动画
。您只需将示例替换为ObjectAnimator
,您的问题可能会得到解决。因为ObjectAnimator
不仅可以设置动画,还可以导航视图更改,而简单视图动画只是重新绘制对象。检查更多细节 “parent.getChildAt(parent.childCount-1)”也只是我在寻找一些解决方法,调用相同的视图结果。是否在动画中为旋转动画设置任何轴?你期望的结果是什么?你有它的照片吗?或者在其他应用程序中也有类似的情况?@aminography是的,我在应用程序的其他部分使用它,它工作正常,但是这些都是在活动开始时绘制的(它在布局的XML中硬编码)。不幸的是,它的行为方式与我预期的不同。@JakubKostka你检查了我的答案吗?ObjectAnimator唯一的缺点是它的开始和结束“过渡”,基本上它只是变慢了,这会导致不同的动画外观。但它的工作原理和我预期的一样。请发布一个ObjectAnimator的示例,这样它就符合赏金的要求,也可以帮助其他人,谢谢。对于“开始和结束‘过渡’”上的“减速”,我建议您使用不同的插值器。它们是要配置的一行程序,非常有意义:另外,请记住,如果使用代码ProGuard/R8,ObjectAnimator可能会有点烦人。我会尽可能推荐ValueAnimator(它的超类)。
loadingImage.pivotX = (loadingImage.getWidth() * 0.5).toFloat()
loadingImage.pivotY = (loadingImage.getHeight() * 0.5).toFloat()