Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 视图';通用动画覆盖的s轴不工作_Java_Android_Kotlin - Fatal编程技术网

Java 视图';通用动画覆盖的s轴不工作

Java 视图';通用动画覆盖的s轴不工作,java,android,kotlin,Java,Android,Kotlin,我目前正在尝试为动画叠加制作一个通用方法。工作方式如下:将活动作为参数传递->方法将所需视图附加到活动的根视图上,使其无效,并在本例中启动旋转动画。然而,动画的轴心并没有正确地应用于视图,除此之外一切都正常,所以它只是从视图的X和Y旋转,这是不正确的 方法: fun createLoading(activity: Activity, activityWidth: Int): Animation { val loadingAnimation = AnimationUtils.loadAni

我目前正在尝试为动画叠加制作一个通用方法。工作方式如下:将活动作为参数传递->方法将所需视图附加到活动的根视图上,使其无效,并在本例中启动旋转动画。然而,动画的轴心并没有正确地应用于视图,除此之外一切都正常,所以它只是从视图的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
}

最好有样品,在当地检查一下。我不确定,您在本示例中谈论的是哪个轴心。在我们的例子中,轴应该相对于动画下的视图,而不是父视图。所以在我们的例子中,如果是旋转,下一步就是正确的改变

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()