我有一个Surfaceview,可以绘制操纵杆视图。该视图是具有ontouchevent的自定义视图,并且未调用ontouch事件。为什么?这是代码...
表面视图:
public class GameView extends SurfaceView implements Runnable {
public void draw() {
if (ourHolder.getSurface().isValid()) {
canvas = ourHolder.lockCanvas();
//some code
joystickOnScreen.layout(10, (int)(sh*0.8f), (int)(sh*0.2f), (int)(sh*1f));
canvas.save();
joystickOnScreen.draw(canvas);
canvas.restore();
//some code
ourHolder.unlockCanvasAndPost(canvas);
}
}
}
操纵杆视图:
public class Joystick extends View {
public Joystick(Context context) {
super(context);
setFocusable(true);
setClickable(true);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
//some code
}
}
SurfaceViews不是ViewGroups,因此,它的行为不像普通的LinearLayout / RelativeLayout那样,将事件广播给孩子。相反,您可以手动覆盖onDraw来绘制它,或者从某个外部循环中调用draw方法,对吗?仅通过共享的代码就无法推断出如何渲染表面视图,但是似乎您是从某种控制器活动/片段中调用了draw()方法的吗?
SurfaceView内部需要做的是做一个ViewGroup通常为您做的事情:找到所有子元素-子元素是指您在SurfaceView区域内渲染的视图-并调用它们的onTouchEvent。根据你的情况,似乎你只需要调用操纵杆的TouchEvent。
这里是一些示例代码:
public class GameView extends SurfaceView {
//initialization and drawing stuff
@Override
public boolean onTouchEvent(MotionEvent ev) {
return joystickOnScreen.onTouchEvent(ev);
}
}