gpt4 book ai didi

java - 自定义 View 。获取旋转 View 中某个点在父级上的位置

转载 作者:行者123 更新时间:2023-11-30 10:28:35 24 4
gpt4 key购买 nike

场景是我在白色背景 FrameLayout 中有一个带有自定义绘图的 View 。没有旋转它只是一个平面圆。但是因为我已经使用

设置了 View 的 rotationX(3D x 轴)
View.setRotationX(50f);

看起来像这样:

enter image description here

如果是平面圆形 View ,我可以很容易地得到带有 View 线的黑色圆圈的位置,因为它与框架布局的大小相同。意思是如果它在 X(32),Y(100) 上,它在框架布局上的位置是 X(32), Y(100)。但是,如果 View 已旋转而 FrameLayout 未旋转,我如何在 FrameLayout 上获得其正确的相对位置 X 和 Y?

我只能提供点在未旋转时在 View 上的 XY 位置。

最佳答案

显然我错了,因为透视投影,只计算 rotationX 并不容易。所以,这就是你可以做到的,yStar 将在 View 的顶部为 1,在底部为 -1,对于 x 坐标,你可以使用与触摸相同的坐标,因为你在 x 轴上旋转它不会'改变

final float rotationDegrees = 45 ;
final double rotationRadians = Math.toRadians(rotationDegrees);
final double ninetyDegrees = Math.toRadians(90);
customView.setRotationX(rotationDegrees);

frameLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {

float cy = frameLayout.getHeight() / 2;

float yt = (event.getY() - cy) / -cy;

double ms = Math.tan(ninetyDegrees + rotationRadians);
double targetX = (yt-ms) / ms;
double targetY = (Math.pow(yt, 2) - yt*ms) / ms;

double yStar = Math.sqrt(Math.pow(targetX- -1, 2) + Math.pow(targetY- 0, 2));

if(targetY>0) yStar *= -1;

Log.d("MainActivity", String.valueOf(yStar));

}
return true;
}
});

解释:

想象一下,从侧面看,右侧从 (1;1) 到 (1;-1) 的部分是您的 FrameLayout。左侧从 (-1;1) 到 (-1;-1) 的线是您的自定义 View ,未旋转。 enter image description hereA 是您触摸 FrameLayout 的点。 R是触摸的投影,它穿过原点,也就是焦点。 S 是旋转 View 所在的线。 B 是旋转 View 上转换 FrameLayout 上的触摸的点。旋转 View 上触摸的y坐标(yStar)是B和F之间的距离(F是自定义 View 的中心)

一旦你有了所有线条的图片并指向这里,你就可以计算 yStar:

yt = FrameLayout 上触摸的 y 坐标,缩放比例在 -1 到 1 之间
A = (1;yt)
R = (x-1)/-1 = (y-yt)/-yt -> 穿过 A 和原点的线
R = y = -yt((x-1)/-1) + yt
R = y = -yt * (-x+1) + yt
R = y = yt * x
S = y = ms * x + ms -> 斜率为 ms 的直线通过 F (-1;0)
ms = tan(90+rotationAngle)

B 将是 R 和 S 之间的交点。如果它们具有相同的斜率 (ms = yt),则不会有交点。所以

yt * x = 毫秒 * x + 毫秒
yt * x - 毫秒 * x = 毫秒
x * (yt - 毫秒) = 毫秒
x = (yt - ms)/ms -> B的x坐标

y = yt * ((yt - ms)/ms)
y = (yt^2 - yt * ms)/ms -> B的y坐标

现在计算与 F 的距离,如果 y 低于 F,则乘以 -1。

关于java - 自定义 View 。获取旋转 View 中某个点在父级上的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44501978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com