メソッドを持つカスタム ビューを作成しましたOnTouchEvent(MotionEvent event)
。これにより、ビューを押すと色が変わります。
また、アクティビティに を実装し、これOnTouchListener
を実行してビューを登録しました。view.setOnTouchListener(this);
これにより、アクティビティのみが機能するという問題が発生しOnTouchListener
ます。
これに対する解決策はありますか?
これは、コメントで指定されたリンクを試した後の私のコードです。金額すみません!:
私のカスタムビュー:
public class DotView extends View implements OnTouchListener {
int RADIUS = 30;
int prevRADIUS;
private Paint paint = new Paint();
float mTranslateX;
float mTranslateY;
int dotX, dotY, color;
private Activity context = null;
public void ReservedCanvas(Activity context) {
super(context);
this.context = context;
this.paint = new Paint();
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
paint.setAntiAlias(true);
}
public DotView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setColor(Color.BLACK);
}
public void setColor(int color) {
paint.setColor(color);
invalidate();
}
public int getColor() {
return paint.getColor();
}
public void setRadius(int radius) {
RADIUS = radius;
invalidate();
}
public int getRadius() {
return RADIUS;
}
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mTranslateX, mTranslateY);
canvas.drawCircle(0, 0, RADIUS, paint);
canvas.restore();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int dia = RADIUS * 4;
int w = resolveSize(dia, widthMeasureSpec);
int h = resolveSize(dia, heightMeasureSpec);
setMeasuredDimension(w, h);
float radius = Math.min(w, h) / 2F;
mTranslateX = radius;
mTranslateY = radius;
}
private void setOnTouchFeedback(Boolean bool) {
// TODO Check this works
if (bool == true) {
int rad = getRadius();
prevRADIUS = rad;
float touchedRad = (float) (rad * 1.4);
int rounded = Math.round(touchedRad);
setRadius(rounded);
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_DOWN: {
this.pointerPressed(event);
break;
}
case MotionEvent.ACTION_MOVE: {
this.pointerDragged(event);
break;
}
case MotionEvent.ACTION_UP: {
this.pointerReleased();
break;
}
}
return true;
}
protected void pointerPressed(MotionEvent event) {
// you can save touch point here!
setOnTouchFeedback(true);
}
protected void pointerDragged(MotionEvent event) {
// for get x ==> eveevent.getX()
// for get y ==> eveevent.getY()
this.repaint();
}
protected void pointerReleased() {
}
public void repaint() {
this.invalidate();
}
}