拡張する独自のコンポーネントを作成しました。その中に、マージンで配置されているタイプRelativeLayout
のフィールドがあります。View
青いクワッドは私の親ビューを表し、赤い円は子です。
画面上で指を動かしながら、ユーザーがこの赤い円を動かせるようにしたいと思います。これは私のonTouchEvent()
方法です:
@Override
public boolean onTouchEvent(MotionEvent event) {
int eventAction = event.getAction();
switch (eventAction) {
case MotionEvent.ACTION_DOWN:
// finger touches the screen
break;
case MotionEvent.ACTION_MOVE:
marginX = (int)event.getX();
marginY = (int)event.getY();
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams(); // pointer is this red circle
lp.setMargins(marginX, marginY, 0, 0);
break;
case MotionEvent.ACTION_UP:
// finger leaves the screen
break;
}
return true;
}
しかし、ユーザーが画面上で指を動かしている間は位置が更新されず、ユーザーが画面から指を離したときにのみ更新されることがすぐにわかりました。基本的に、指を動かすと円は同じ位置にとどまり、動きを止めると新しい位置に円が描かれます。親ビューと子ビューの両方でメソッドを使用してみinvalidate()
ましたが、役に立ちませんでした。UIスレッドと関係があるのではないかと思いますが、runOnUiThread()' method as it's not an
Activity`にアクセスできません。
編集: を使用できるように、アクティビティをクラスに渡しましたrunOnUiThread()
。私のcase: ACTION_MOVE
今は次のようになります:
case MotionEvent.ACTION_MOVE:
marginX = (int)event.getX();
marginY = (int)event.getY();
activity.runOnUiThread(new Runnable() {
public void run() {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
lp.setMargins(marginX, marginY, 0, 0);
pointer.invalidate();
}
});
break;