Android ScaleAnimation到Rect的中心

时间:2018-03-08 11:29:59

标签: android animation zoom scale centering

我正在尝试使用ScaleAnimation对象缩放到Android中RelativeLayout中放置的Rect的中心。

注意:Rect高度与containerView的高度相等,因此只需尝试查找pivotXValue,中心的pivotYValue为0.5F。 PivotY工作正常。

我正在尝试获取Rect的中心,然后将其除以视图的宽度以获取pivotXValue,然后我在ScaleAnimation构造函数中使用它。

我可以添加Rect并查看它的确切位置来调试它。并且它不会缩放到Rect的中心。根据rect是否位于containerView中心的左侧或右侧,“缩放点”似乎分别偏向右侧或左侧。

那是:

对于容器视图中间的过去,对于LEFT越多,ScaleAnimation的“缩放点”的偏移量就越大。

在容器视图中间经过的右边越多,右边的ScaleAnimation的“缩放点”的偏移量就越多。

以下是代码:

val zoomScale = 2.0F

val pivotXReference = zoomRect.right - (zoomRect.width() / 2F)

val pivotXValue = pivotXReference / containerView.width.toFloat()

val scaleAnim = ScaleAnimation(
                1f,
                zoomScale,
                1f,
                zoomScale,
                Animation.RELATIVE_TO_SELF,
                pivotXValue,
                Animation.RELATIVE_TO_SELF,
                0.5F)

scaleAnim.duration = 250
scaleAnim.fillAfter = true
containerView.animation = scaleAnim

1 个答案:

答案 0 :(得分:0)

我放弃了ScaleAnimation,因为我无法理解它,而且我知道它不会更新视图本身的属性,只会更新绘图,这不是我需要的。

我通过使用ObjectAnimator类解决了它。它根据我的需要放大并降落在矩形的中心:

        val pivotXReference = zoomRect.right - (zoomRect.width() / 2)

        val anim = ObjectAnimator.ofFloat(fretboardView, "scaleX", zoomScale)
        anim.duration = 250

        val anim2 = ObjectAnimator.ofFloat(fretboardView, "scaleY", zoomScale)
        anim2.duration = 250

        // It was scaled at the center, so minus /2 offsets it to 0, then subtract how "right" you want to offset the x position
        val animX = ((fretboardView.width * zoomScale) / 2) - (pivotXReference.toFloat() * zoomScale)
        val anim3 = ObjectAnimator.ofFloat(fretboardView, "x", animX)
        anim3.duration = 250

        val animSetXY = AnimatorSet()
        animSetXY.playTogether(anim, anim2, anim3)
        animSetXY.start()