2010年12月22日水曜日

スクリーン座標とボタンのローカル座標

前回の投稿で軽く触れてましたがもうちょい詳しく書いておきます

赤い軸がスクリーン座標軸で青い軸がボタンの持つローカル座標軸
間違っていました(詳しくは次の投稿で)
それぞれの座標を取得する方法は

スクリーン座標
float android.view.MotionEvent.getRawX()

public final float getRawX ()

Since: API Level 1
Returns the original raw X coordinate of this event. For touch events on the screen, this is the original location of the event on the screen, before it had been adjusted for the containing window and views.


ローカル座標
 こっちは配列の先頭インデックスの座標を取得する
 タッチイベント中に座標を何個か保持してるみたいで下のメソッドでは最新の座標を取得する
 保持している座標の数などはgetHistorical***などが用意されている
float android.view.MotionEvent.getY()

public final float getX ()

Since: API Level 1
getX(int) for the first pointer index (may be an arbitrary pointer identifier).

詳しくはリファレンスのview.MotionEventのページ見るのが早い
http://developer.android.com/reference/android/view/MotionEvent.html


それで前回のプログラム(ドラッグ中の座標を取得してボタンに設定する)の補足です
主に座標変換について。
取得したスクリーン座標をそのままボタンに設定すると下の画像のようにボタンの左上になっちゃいます。これはボタンを設定する際は矩形の左上の座標を設定する仕様になっているためです。


そこで、ボタンをタップした時点でのローカル座標を取得してその分ずらす必要があります。



具体的には緑をタップしたときのローカル座標(getXなど)を保持しておいてドラッグ中のスクリーン座標(getRawXなど)に対して引いてあげると押した時まま一緒に移動してくれます。
詳しいことは前回の投稿の最後にあるソースを参照してください。


ここまで説明したのですがX方向に対しては上記の説明が正しいのですが
Y方向に関してはgetRawY()-getY()だけだとボタンのheight分ずれてしまいました。
なので前回のプログラムではgetRawY()-(geyY()+button.height)としています。
なんでだろう・・・

-----------------------------------------------------------------------------------------------------------------------------
//追記
分かった・・・
簡単にいうと座標系がもう一つあったということ
長くなりそうなんで新しい投稿で説明します

0 件のコメント:

コメントを投稿