Поворот универсального анимационного наложения View не работает - PullRequest
2 голосов
/ 12 октября 2019

В настоящее время я пытаюсь создать универсальный метод для наложения анимации. Работает следующим образом: передача активности в качестве параметра -> метод присоединяет необходимые представления к корневому представлению действия, делает его недействительным и запускает в этом случае вращающуюся анимацию. Однако шарнир анимации не применяется для правильного просмотра, все работает, кроме этого, поэтому он просто вращается из 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-анимацию и применять к представлению, но ни один из них не сработал для меня. Цените любые идеи.

РЕДАКТИРОВАТЬ: Декларация 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"

1 Ответ

2 голосов
/ 19 октября 2019

Было бы неплохо иметь образец, чтобы проверить его на месте. Я не уверен, о какой оси вы говорите в этом примере. В нашем случае Pivot должен быть относительно представления при анимации , а не родительского. Так что в нашем случае, если это вращение, правильные изменения будут следующими.

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

Последнее замечание, я настоятельно рекомендую придерживаться Android Property Animation, а не View Animation. Вы можете просто заменить ваш образец на ObjectAnimator, и, возможно, проблема может быть решена. Потому что ObjectAnimator не только анимирует, но и просматривает изменения, где простая анимация просмотра просто перерисовывает объект. Подробности уточняйте из документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...