プロジェクトにいくつかのドラッグ アンド ドロップ メカニズムを追加しようとしました。私がやっている方法は、基本的に、タッチ イベントが発生するたびに 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()メソッドを呼び出すことにあることがわかりました。
その呼び出しを定期的に起動するタイマーに移動したところ、結果ははるかに良くなりました。
他の誰かがそれを経験し、タイマーを使用せずにそれを行うより良い方法を知っていますか?
私は、実際に必要以上に常にリフレッシュすることを避けたいと思っています。
ご協力いただきありがとうございます!