2

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 で概ね問題ないように見えます。なぜ何か提案はありますか?

4

1 に答える 1

0

さて、RawY 座標から 50 を引くと、Attempt Two で概ね問題ないように見えます。なぜ何か提案はありますか?

ステータス バーとタイトル バーがあると思います。これらはそれぞれ約 25 ピクセルの高さだと思います。そのため、両方を使用すると、画面上の要素は予想より 50 ピクセルずれます。

于 2011-01-14T18:43:56.860 に答える