顯然我錯了,因爲透視投影,只計算rotationX並不容易。所以,這就是你如何做到這一點,yStar將視圖頂部爲1,底部爲-1,對於x座標,您可以使用與座標相同的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)左邊的行是您的自定義視圖,而不是旋轉。 A是您觸摸FrameLayout的點。 R是觸摸的投影,它通過原點,這是焦點。 S是旋轉視圖所在的線。 B是投影FrameLayout上的觸摸的旋轉視圖上的點。在旋轉視圖上的觸摸的y座標(Y軸)是B和F之間的距離(F是自定義視圖的中心)
一旦您獲得了所有線條的圖片並指出您可以如何計算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 =毫秒* X + MS - >斜率毫秒穿過F線(-1; 0)
MS = TAN(90 + rotationAngle)
乙將R和S之間的intersetction 。如果它們具有相同的斜率(ms = yt),則不會有交集。 所以
YT * X =毫秒* X + MS
YT * X - 毫秒* X =毫秒
X *(YT - 毫秒)=毫秒
X =(YT - MS)/ MS - >在x B的座標
Y = YT *((YT - MS)/ MS)
Y =(YT^2 - YT *毫秒)/ MS - >的Y B
的座標
現在計算與F的距離,如果y低於F,則乘以-1。
免責聲明:只是一個想法||也許對上面顯示的佈局運行一個不可見的視圖,但是沒有任何天使和傾斜,並且讓你的共同組織脫離那個?然後,只需使用上述視圖作爲視圖向用戶顯示,但不會從中收集實際代碼。只有代碼然後傳輸到隱藏的視圖,然後你做你的計算? – fluffy
我知道我可能會在另一次錯誤的時候弄錯你的問題,但我覺得這次我們離得更近了。如果你看我張貼的圖畫,你有B,你想找到A? – lelloman
@lelloman lemme需要一段時間瞭解它我還在努力 – Sheychan