次のようなカスタム ビュー コントロールがあります。
アクティビティ内で、このビューを緑色のアークにドラッグして画面上で移動できるようにしたいと考えています (左右は関係ありません)。
また、上部の黄色の円弧がタップされているかどうか、中央の円または下部の円弧を検出できるようにしたいと考えています。
タップがどのエリアのどこにあるかを検出するのに苦労しています。これは、アクティビティ内で使用しているコードです。
float dX, dY;
final MyCustomView myCustomView = (MyCustomView)findViewById(R.id.test);
final Boolean[] movable = {false};
myCustomView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
movable[0] = false;
dX = view.getX() - event.getRawX();
dY = view.getY() - event.getRawY();
int x = (int) event.getX();
int y = (int) event.getY();
if (myCustomView.leftArcRegion.contains(x,y) || myCustomView.rightArcRegion.contains(x,y)){
movable[0] = true;
} else if (myCustomView.topArcRegion.contains(x,y)){
//todo: do something if top arc area is selected
} else if (myCustomView.midRoundedBitmapRegion.contains(x,y)){
//todo: do something if mid bitmap area is selected
} else if (myCustomView.bottomArcRegion.contains(x,y)){
//todo: do something if bottom arc area is selected
}
break;
case MotionEvent.ACTION_MOVE:
if (movable[0]) {
view.animate()
.x(event.getRawX() + dX)
.y(event.getRawY() + dY)
.setDuration(0)
.start();
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
break;
default:
return false;
}
return true;
}
});
そして、これらはカスタム ビュー コントロールのパブリック フィールドです。
public Region topArcRegion;
private Path topArc;
//topArc is my top arc path
RectF rectFTop = new RectF();
topArc.computeBounds(rectFTop, true);
topArcRegion = new Region();
topArcRegion.setPath(topArc, new Region((int) rectFTop.left, (int) rectFTop.top,
(int) rectFTop.right, (int) rectFTop.bottom));
しかし、この「含む」メソッドでチェックすると、円弧ではなく、これらの領域に長方形の形状を使用しているように見えます。そのため、期待した結果が得られません。
では、アプリ ロジックを適用するために、最初のタップ (トップ アーク、ボトム アーク、サイド アーク、またはミドル ビットマップ) を検出するにはどうすればよいでしょうか?