[英]Android: OnTouch not responding.
我希望在触摸视图时执行一项操作。 但是,触摸不响应。 该应用程序不会崩溃,只是似乎忽略了它。
public class CustomDrawableView extends View implements OnTouchListener
{
static final int width = 100;
static final int height = 50;
public CustomDrawableView(Context context)
{
super(context);
setFocusable(true);
setOnTouchListener(mCustomDrawableView);
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x, y, x + width, y + height);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN )
{
x = 400;
return true;
}
else {
x = 300;
return false;
}
}
protected void onDraw(Canvas canvas)
{
int mCanvasHeight = canvas.getHeight();
int mCanvasWidth = canvas.getWidth();
canvas.save();
canvas.rotate(R,x,y);
if (y >= mCanvasHeight-100) {
y = 0;
}
RectF oval = new RectF(x, y, x + width, y
+ height); // set bounds of rectangle
Paint p = new Paint(); // set some paint options
p.setColor(Color.BLUE);
canvas.drawOval(oval, p);
canvas.restore();
invalidate();
}
}
我尝试了一堆不同的代码来修复它。 除了将setOnTouchListener(mCustomDrawable)更改为mCustomDrawableView.setOnTouchListener(this)以外,其他任何操作均不起作用。 活动中还有很多我没有提出的代码。
我猜您相信onTouch()
不会触发,因为您没有看到图形响应x
或其他任何变化而改变。 如果是这种情况,似乎您缺少在触摸处理程序中对invalidate()
的调用,从而导致View
再次重绘自身(通过调用onDraw()
)。
另外,实际上在onDraw()
本身中有一个invalidate()
实际上不应该在其中。 我想,这肯定会导致您的View
地重绘自身,因此,实际上,我想您应该看到更新,因为在那里。 但这不是使View
动画的方式; 您应该改为使用Thread
或Handler
来安排定期的,定期的invalidate()
-或通过其他方式来定期安排更新。
同样,当您可以像完成操作一样覆盖onTouch()
时,也无需实现“ OnTouchListener”。 您可以通过以下两种方法来检测View
触摸事件:(1)像这样覆盖onTouch()
,以获取该View
触摸事件。 (2)使用setOnTouchListener()
注册一个侦听器。 后者的选择使您能够侦听从一个触摸事件的侦听器View
或多个View
S,同时也“看到”触摸注册前的事件View
自己的onTouch()
看到他们。
我看到的另一件事是,当您收到ACTION_DOWN事件时,将x
设置为400,但是对于其他任何类型的事件,例如ACTION_MOVE,则将其设置为300。 考虑到实际上很难保持手指足够静止以致在ACTION_DOWN之后永远不会立即引起一连串的ACTION_MOVE事件,也许当x
等于400时您永远都看不到图形。
您确实需要发布一个完整的示例(例如,发布的代码具有setOnTouchListener(mCustomDrawableView)
,其中尚未在任何地方定义setOnTouchListener(mCustomDrawableView)
以及mCustomDrawableView
特定错误。 另外,您应该使用调试器查看您的onTouch
是否曾经执行过(在其中插入一个断点)。
另外,您应该接受一些答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.