OnTouchEvent在SurfaceView画布内的视图上不起作用

问题描述 投票:0回答:1

我有一个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
    }
}
android canvas android-canvas surfaceview ontouch
1个回答
0
投票

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.