在Android中进行缩放、旋转和平移操作后,如何获取视图相对于父视图的位置?

3

我正在开发一个包含图像缩放、旋转和平移操作的功能。这些操作对我来说都很好使。

现在,我需要检查视图相对于父级的位置。我已经编写了以下代码以在缩放和平移后获取视图位置。

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

谢谢!


你找到任何解决方案了吗? - Kishan Thakkar
不,我还在寻找解决方案。 - Dhaval Patel
你找到任何解决方案了吗? - Hardik Thakkar
不,看起来在这段代码中实现起来相当困难。 - Dhaval Patel
除了旋转之外,我发现还有一些有用的东西。尝试从中心缩放视图,然后您可以准确地获得X和Y平移位置。 - Kishan Thakkar
@DhavalPatel 希望我的回答有用,你能看一下吗? - cmak
1个回答

1
您可能需要使用视图的旋转值手动计算位置。
请记住,实际的视图并不会旋转,只有它的内容会旋转。可以用以下方式表示(红色=旋转,蓝色=实际视图):

representation

A: 视图中心。
B: 实际视图矩形的左上角边缘。
C: 旋转后视图的左上角边缘。
(alpha): AB 和 AC 之间的角度。
我们有A、B和。我们想知道C。因此,使用三角学,我们得到this formula

enter image description here

使用以下数值(假设B是坐标系的原点):
  • A:(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;

这就是你在寻找的职位。

1
对于 Dhaval 来说,提到如何计算它(例如,链接到 https://www.mathsisfun.com/algebra/sohcahtoa.html)会很有帮助。 - Michael
1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
@Michael 我改进了答案。 - cmak
1
恭喜你改进了答案!这样的答案 @dhaval-patel 肯定会接受的 ;) - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接