我希望在触摸视图时执行操作。但是,触摸不响应。该应用程序不会崩溃,它似乎只是忽略它。
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)应用程序崩溃。活动中有很多代码我没有提到。
答案 0 :(得分:1)
我猜你相信onTouch()
没有被触发,因为你没有看到你的图形因x
或其他任何变化而发生变化。如果是这种情况,您似乎错过了触摸处理程序中invalidate()
的调用,导致View
再次重绘(通过调用onDraw()
)。
此外,您实际上invalidate()
内部onDraw()
本身不应该存在。它肯定会导致你的View
一遍又一遍地重绘 - 我想 - 实际上,我猜你应该看到更新,因为那就是那里。但这不是你应该制作View
动画的方式;您应该使用Thread
或Handler
来安排定期,定期invalidate()
- 或其他一些方法来定期安排更新。
当你可以像你一样覆盖onTouch()
时,也不需要实现'OnTouchListener'。您可以通过以下几种方法检测View
的触摸事件:(1)覆盖onTouch()
,以便在View
上获取触摸事件。 (2)使用setOnTouchListener()
注册听众。后一个选项使您能够拥有一个侦听来自一个View
或多个View
的触摸事件的侦听器,并且它还会在注册的View
拥有{之前'看到'触摸事件' {1}}看到了他们。
我看到的另一件事是,当您收到ACTION_DOWN事件时,您将onTouch()
设置为400,但是对于任何其他类型的事件(例如ACTION_MOVE),您将其设置为300。考虑到实际上很难保持足够的手指,以便在ACTION_DOWN之后不会立即引起一串ACTION_MOVE事件,也许你只是在x
处于400或者什么时才看到图形。
您确实需要发布一个完整的示例(例如您发布的代码x
,其中setOnTouchListener(mCustomDrawableView)
未在任何地方定义)以及来自Logcat的特定错误。此外,您应该使用调试器来查看您的mCustomDrawableView
是否曾执行过(在其中插入断点)。
另外,你应该接受一些答案。