onTouchEvent 没有被执行
onTouchEvent is not getting executed
我正在实现一个简单的自定义视图,主要是为了掌握 android canvas 的窍门。这是一个简单的井字板。
这是自定义视图 class :
public class BoardInterface extends View implements View.OnTouchListener{
private int board_width, board_height;
private final Context context;
public BoardInterface(Context context) {
super(context);
this.context = context;
}
@Override
protected void onDraw(Canvas canvas) {
board_width = canvas.getWidth();
board_height = canvas.getHeight();
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);
canvas.drawLine((board_width/5)*2, (board_height/6), (board_width/5)*2, ((board_height/6)*5), paint);
canvas.drawLine(((board_width/5)*3), (board_height/6), ((board_width/5)*3), ((board_height/6)*5), paint);
canvas.drawLine((board_width/6), ((board_height/7)*3), ((board_width/6)*5), ((board_height/7)*3), paint);
canvas.drawLine((board_width/6), ((board_height/7)*4), ((board_width/6)*5), ((board_height/7)*4), paint);
super.onDraw(canvas);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int x, y;
Log.d("TOUCH", "WORKS");
if (event.getAction() == MotionEvent.ACTION_DOWN) {
x = (int) Math.floor(event.getX());
y = (int) Math.floor(event.getY());
Toast.makeText(context, String.valueOf(x) + "," + String.valueOf(y), Toast.LENGTH_SHORT).show();
}
return super.onTouchEvent(event);
}
}
我设置了一个 OnTouchListener 并覆盖它以显示一个简单的 toast。
屏幕上没有任何内容,即 toas,我也没有在 logcat.
中收到 Log.D() 消息
我在这里错过了什么?
尝试覆盖以下方法而不是 onTouch 方法。
@Override
public boolean onTouchEvent(MotionEvent event){....}
如果仍然没有调用触摸事件,请在构造函数中的某处调用
setClickable(True);
以上解决方案有效。
我还找到了一个解决方案,只需对我的代码进行一次更改[在构造函数中添加一行]。
public BoardInterface(Context context) {
super(context);
this.context = context;
setOnTouchListener(this);
}
添加 setOnTouchListener(this);
后,onTouch() 方法执行得很好。
我正在实现一个简单的自定义视图,主要是为了掌握 android canvas 的窍门。这是一个简单的井字板。
这是自定义视图 class :
public class BoardInterface extends View implements View.OnTouchListener{
private int board_width, board_height;
private final Context context;
public BoardInterface(Context context) {
super(context);
this.context = context;
}
@Override
protected void onDraw(Canvas canvas) {
board_width = canvas.getWidth();
board_height = canvas.getHeight();
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);
canvas.drawLine((board_width/5)*2, (board_height/6), (board_width/5)*2, ((board_height/6)*5), paint);
canvas.drawLine(((board_width/5)*3), (board_height/6), ((board_width/5)*3), ((board_height/6)*5), paint);
canvas.drawLine((board_width/6), ((board_height/7)*3), ((board_width/6)*5), ((board_height/7)*3), paint);
canvas.drawLine((board_width/6), ((board_height/7)*4), ((board_width/6)*5), ((board_height/7)*4), paint);
super.onDraw(canvas);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int x, y;
Log.d("TOUCH", "WORKS");
if (event.getAction() == MotionEvent.ACTION_DOWN) {
x = (int) Math.floor(event.getX());
y = (int) Math.floor(event.getY());
Toast.makeText(context, String.valueOf(x) + "," + String.valueOf(y), Toast.LENGTH_SHORT).show();
}
return super.onTouchEvent(event);
}
}
我设置了一个 OnTouchListener 并覆盖它以显示一个简单的 toast。 屏幕上没有任何内容,即 toas,我也没有在 logcat.
中收到 Log.D() 消息我在这里错过了什么?
尝试覆盖以下方法而不是 onTouch 方法。
@Override
public boolean onTouchEvent(MotionEvent event){....}
如果仍然没有调用触摸事件,请在构造函数中的某处调用
setClickable(True);
以上解决方案有效。
我还找到了一个解决方案,只需对我的代码进行一次更改[在构造函数中添加一行]。
public BoardInterface(Context context) {
super(context);
this.context = context;
setOnTouchListener(this);
}
添加 setOnTouchListener(this);
后,onTouch() 方法执行得很好。