2017-06-12 73 views
2

該場景是我在白色背景FrameLayout中使用了具有自定義繪圖的視圖。沒有旋轉,它只是一個平坦的圓圈。但是,正如我已經設置使用視圖的的rotationX(3D x軸)自定義視圖。獲取旋轉視圖中父點的位置

View.setRotationX(50f); 

它看起來像這樣:

enter image description here

如果扁圓形的看法,我可以很容易地得到黑的位置與視圖的一行相交,因爲它與框架佈局的大小相同。意思是如果它在X(32),Y(100)上,它在框架佈局上的位置是X(32),Y(100)。但是,如果視圖被旋轉並且FrameLayout不是,我怎麼才能在FrameLayout上獲得正確的相對位置X和Y?

我只能提供的是當它還沒有旋轉時視圖上點的XY位置。

+0

免責聲明:只是一個想法||也許對上面顯示的佈局運行一個不可見的視圖,但是沒有任何天使和傾斜,並且讓你的共同組織脫離那個?然後,只需使用上述視圖作爲視圖向用戶顯示,但不會從中收集實際代碼。只有代碼然後傳輸到隱藏的視圖,然後你做你的計算? – fluffy

+0

我知道我可能會在另一次錯誤的時候弄錯你的問題,但我覺得這次我們離得更近了。如果你看我張貼的圖畫,你有B,你想找到A? – lelloman

+0

@lelloman lemme需要一段時間瞭解它我還在努力 – Sheychan

回答

1

顯然我錯了,因爲透視投影,只計算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)左邊的行是您的自定義視圖,而不是旋轉。 enter image description here 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。

+0

嗨,我理解你的答案,但事實並非如此。圓形視圖在X軸上旋轉50度,這意味着它就像一枚硬幣翻轉一點。沒有旋轉,它只是一個平坦的圓,左側的線爲直線。線條座標上的點很容易在framelayout上找到,因爲它們將完全相同。但是,如果視圖以x軸50度旋轉,它在framelayout上的位置將完全不同。這就是我想要得到的。 – Sheychan

+0

哈哈我完全錯過了setRotationX中的X – lelloman

+0

@Sheychan無論如何,我認爲問題更容易,只有x,我要吃東西,然後更新答案 – lelloman