Android アプリケーションのユーザーが、ある TextView (A) のコンテンツを別の TextView (B) に移動できるようにしたいと考えています。これは、A からドラッグして B の上で離すことで実行できるはずです。onTouch イベント、特に ACTION_DOWN と ACTION_UP を使用してこれを実現しようとしました。これは簡単だと思いましたが、いくつかの問題に遭遇しました。
試行 1
最初に、イベント ハンドラーへの各呼び出しに渡されるビューを取得しようとしました。A はビューとして渡されるため、これは ACTION_DOWN では問題ありません。ただし、ACTION_UP イベントでは、B ではなく A もビューとして渡されます。
試行 2
ACTION_UP イベント (getRawX()、regRawY()) の生の座標をキャプチャし、これらの座標を、ユーザーが「ドロップ」できるビューの左、右、上、下と比較します。残念ながら、ビューの座標はイベントの座標に関連していないようです。
質問
この単純なドラッグ アンド ドロップをどのように実装するか、または 2 回の試行でどのような間違いを犯していますか。
リスナー コード (2 回試行)
OnTouchListener PlayerListener = new OnTouchListener () {
public boolean onTouch(View v, MotionEvent me) {
boolean mProcessed = false;
int mActionX = 0;
int mActionY = 0;
int mAction = me.getAction();
/* Determine gesture */
switch (mAction) {
case MotionEvent.ACTION_DOWN:
mProcessed = theTeams.touchPlayer(v,mAction);
break;
case MotionEvent.ACTION_UP:
mActionX = (int) me.getX();
mActionY = (int) me.getY();
mProcessed = theTeams.endTouch(v,mActionX,mActionY);
break;
ハンドラー コード (2 回試行)
public boolean endTouch(View v, int dropX, int dropY) {
int mLeft = 0;
int mRight = 0;
int mTop = 0;
int mBottom = 0;
boolean mFound = false;
View mView = null;
/* Find control at that position */
mView = (TextView) findViewById(R.id.lCourt1ok);
mLeft = mView.getLeft();
mRight = mView.getRight();
mTop = mView.getTop();
mBottom = mView.getBottom();
if ((dropX >= mLeft) && (dropX <= mRight )
&& (dropY <= mBottom) && (dropY >= mTop))
mFound = true;
あとがき
さて、RawY 座標から 50 を引くと、Attempt Two で概ね問題ないように見えます。なぜ何か提案はありますか?