Android中的缩放、旋转和平移操作后如何获取相对于Parent的View位置?

2023-12-20

我正在开发一项功能,其中包括图像缩放、旋转和平移操作。所有这些操作对我来说都运行良好。

现在,我需要检查相对于父级的视图位置。我开发了以下代码来获取缩放和翻译后的视图位置。

private fun findViewPosition(view: View) {
    val left = view.left.toFloat()
    val top = view.top.toFloat()

    val px = view.pivotX
    val py = view.pivotY

    val tx = view.translationX
    val ty = view.translationY

    val sx = view.scaleX
    val sy = view.scaleY

    val rx = view.rotationX
    val ry = view.rotationY
    val r = view.rotation

    // Getting correct value for startX  and startY after scale and translate.
    // After the rotation, I'm not sure how to applied the formula.
    val startX = left - (view.width * sx - view.width) / 2 + tx
    val startY = top - (view.height * sy - view.height) / 2 + ty
    Log.w("Start", "$startX , $startY")

    val endX = left + view.width + (view.width * sx - view.width) / 2 + tx
    val endY = top + view.height + (view.height * sy - view.height) / 2 + ty
    Log.w("End","$endX , $endY")
}

旋转视图后我在找到位置时遇到困难。如果有人能在这方面帮助我,那将对我有很大帮助。

如果您想尝试一下代码,这里是示例代码:AndroidViewScaleRotateTranslate.zip https://www.dropbox.com/s/6fss43hem7np5ah/AndroidViewScaleRotateTranslate.zip?dl=1

谢谢你!


您可能需要使用视图的旋转值手动计算位置。

请记住,实际视图不会旋转,只有内容会旋转。它可以这样表示(红色=旋转,蓝色=实际视图):

A:视图的中心。

B:实际视图的左上边缘Rect.

C:旋转视图的左上边缘。

???? (alpha):AB 和 AC 之间的角度。


我们有 A、B 和 ????。我们想知道 C。因此,使用三角函数,我们得到这个公式 https://math.stackexchange.com/questions/1384994/rotate-a-point-on-a-circle-with-known-radius-and-position:

使用以下值(假设 B 是坐标原点):

  • 答:(Ax = view.getWidth() / 2) (Ay = view.getHeight() / 2)

  • B:(Bx = 0),(By = 0)

  • ???? (alpha): (???? = view.getRotation())

由于 B 始终为 0,我们可以简化:

 ???????? = ???????? - (????????)cos???? + (????????)sin????

 ???????? = ???????? - (????????)sin???? - (????????)cos????

代码会是这样的:

float aX = view.getWidth() / 2.f;
float aY = view.getHeight() / 2.f;

float alpha = Math.toRadians(view.getRotation());

float sin = Math.sin(alpha);
float cos = Math.cos(alpha);

float cX = aX - aX * cos + aY * sin;
float cY = aY - aX * sin - aY * cos;

如果现在您想要相对于父级的位置:

float relX = view.getX() + cX;
float relY = view.getY() + cY;

这就是您正在寻找的职位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中的缩放、旋转和平移操作后如何获取相对于Parent的View位置? 的相关文章

随机推荐