我正在尝试使用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
答案 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()