2011-12-09 22 views
13

私は自分のアンドロイドアプリケーションでユーザーに表示している画像があります。タッチ座標をビュー(ScreenToClientに相当)に対して取得

私は彼らがどこにイメージを触っているかを知りたいと思っています。

私は簡単に画面がしかし、これらは絶対座標でOnTouchListener

private OnTouchListener image_Listener = new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      float x = event.getX(); 
      float y = event.getY(); 
      return true; 
     } 
     return false; 
    } 
}; 

を実装することにより、座標取得することができます。私が実際に必要とするのは、これをViewに関連する座標に変換する関数です。

私は少し掘り下げましたが、私はScreenToClientメソッド私は..

誰にもこれに対する良い解決策を知っているのですか、それとも私自身のロールにする必要がありますか?

これは利用可能な方法のようです - そういうわけで私は求めています。

ありがとうございます。

編集:私は座標がまだビューに相対的ではないことを確信していません。私は座標が絶対であったことを読んで誓うことができたかもしれませんが、いくつかの微妙な変化の後で - 私は期待どおりに働いています..騒々しい男のために申し訳ありません。

答えて

20

ちょうど答えると、接触はある意味でビューに相対的です。はい、それらはタッチの生のスクリーン座標です。ただし、ビュー自体にタッチイベントを登録するため、ユーザーが実際にビューにタッチすると起動されます。つまり、画面座標が生のスクリーン座標であっても、ビュー自体の境界内にあります。

あなただけの自分自身との関係で触れたビューのX/Y座標を取得したい場合は、画面座標と連携し、トップをy座標から左をsubractすることができますので、同様に座標:

private OnTouchListener image_Listener = new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      float screenX = event.getX(); 
      float screenY = event.getY(); 
      float viewX = screenX - v.getLeft(); 
      float viewY = screenY - v.getTop(); 
      return true; 
     } 
     return false; 
    } 
}; 

これで、ユーザーが画面下の40 xピクセルをタッチしたが、左余白を10に設定した場合、viewXは30になります。ビューを40 xピクセル下に移動してユーザーが同じスポットにタッチした場合ビューではまだ30になります。

ビュー内でパディングとしてパディングを使用すると、少し複雑になります何も表示されていなくても、Viewとしてカウントされます。

EDIT:

私は何ピエールが言ったことは真実であることを指摘すべきです。ビューに触れると、指をビュー境界の外にドラッグしても指が離されるまでタッチイベントを受信し続けます。つまり、ACTION_UPは、境界内にないビューのタッチ座標を受け取ることができます。

+0

あなたの答えをありがとう。 – syllogism

+0

同じ質問が届いています。チュートリアルから、これらのメソッド(view.getLeft()など)。 "その親に対するビューの位置を返します。"しばしば、複雑なレイアウトでは、調査されたビューはスクリーンビューの直接の子ではありません。したがって、Deevが述べた方法は常に適用できません。新しいアイデアは? – user1914692

+4

ええと、私は方法を見つける:View.getLocationOnScreen()および/またはgetLocationInWindow()を使用します。 – user1914692

2

タッチイベントの座標は、イベントを受け取るビューからの相対座標です。ただし、ビューのサイズに制限されているわけではありません。なぜなら、ユーザーは明らかに同じモーションでビューの外にスライドできるからです。

ACTION_UPまたはACTION_CANCELがトリガされるまで、ポインタはビューの外にあってもモーションイベントを受け取り続けます。

リスナーが正しいビューに登録されていますか?

+0

ええ、私は私が期待どおりに動作し、物事を得た。..右のビューに登録されています。私は単純に、必要以上に困難なものにしていました。ご回答いただきありがとうございます。 – syllogism

18

私はちょうど同じ問題を抱えており、私は常にgetLeft()メソッドとgetTop()メソッドの両方から0を得ました。レイアウトの変更はオプションではなかったので(私はgetTop/Leftはビューの親に対してのみ相対的なものだと思うので)、ビューの絶対位置を取得する方法を見つけなければなりませんでした。ここで

がでgetLocationOnScreen(場所)を使用して、同様のアプローチです:

protected Point getRelativePosition(View v, MotionEvent event) { 
    int[] location = new int[2]; 
    v.getLocationOnScreen(location); 
    float screenX = event.getRawX(); 
    float screenY = event.getRawY(); 
    float viewX = screenX - location[0]; 
    float viewY = screenY - location[1]; 
    return new Point((int) viewX, (int) viewY); 
} 
+0

'screenY - v.getTop()'は(少なくとも私にとっては) – 18446744073709551615

+0

のv.getTop()は私のために働いていませんでしたが、これは動作します。誰でも何か考えがありますか? – eliasbagley

+0

@eliasbagley:v.getTop()はvの親を基準にしていますが、screenYは画面を基準にしています。親が画面の上部に行く場合にのみ機能します。 – user362178

関連する問題