0

プロジェクトにいくつかのドラッグ アンド ドロップ メカニズムを追加しようとしました。私がやっている方法は、基本的に、タッチ イベントが発生するたびに 2 つの操作を行うことです。
まず、タッチ イベントに従って onLayout() 内で使用しているパラメーターを更新し、次に更新のために
requestLayout() を呼び出します。
(従うべきコードのように、OnTouchListener メソッドと View の onTouchEvent() の両方で試しました)

問題は、画面上の結果があまり良くないことです。ドラッグされたビューにティアリングの問題があるように感じました(以前の描画が終了する前に新しい描画が開始されます)

コードは次のようになります (簡略化されたバージョン)。

public class DragAndDrop extends ViewGroup
{
  View touchView;
  float touchX;
  float touchY;

  static int W = 180;
  static int H = 120;

  public DragAndDrop(Context context)
  {
    super(context);

    touchView = new View(context);
    touchView.setBackgroundColor(0xaaff9900);
    addView(touchView);
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b)
  {
    float width = r - l;
    float height = b - t;

    int centerX = (int) (touchX - W / 2);
    int centerY = (int) (touchY - H / 2);

    touchView.layout(centerX, centerY, centerX + W, centerY + H);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    touchX = event.getX();
    touchY = event.getY();

    requestLayout();
    return true;
  }
}

調査した結果、問題はtouchListener メソッド内でrequestLayout()メソッドを呼び出すことにあることがわかりました。 その呼び出しを定期的に起動するタイマーに移動したところ、結果ははるかに良くなりました。

他の誰かがそれを経験し、タイマーを使用せずにそれを行うより良い方法を知っていますか?
私は、実際に必要以上に常にリフレッシュすることを避けたいと思っています。

ご協力いただきありがとうございます!

4

1 に答える 1

-1

あなたのフルバージョンにはサブクラス化Viewとオーバーライドが含まれていると言っていると思います。その場合は、この回答onTouchEvent()を参照してください。私自身の同様のドラッグの実装では、指が動いたときに指の周りでタッチが振動しているように見える移動イベントが見られました。で、動きは私の本当の指の動きのようにスムーズでした。event.getX()event.getY()event.getRawX()event.getRawY()

余談ですが、生の座標では、ACTION_DOWNイベントの座標を保存してから相対距離を再計算し、イベントrequestLayout()を取得するたびに再計算することもおそらく最善ですACTION_MOVE

于 2012-03-12T22:52:19.630 に答える