【问题标题】:OnTouchEvent not working on View inside SurfaceView CanvasOnTouchEvent 在 SurfaceView Canvas 内的 View 上不起作用
【发布时间】:2019-11-06 14:45:25
【问题描述】:

我有一个绘制操纵杆视图的表面视图。该视图是一个自定义视图,它有一个 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
    }
}

【问题讨论】:

  • 我认为您需要将视图设置为可点击?
  • @IanMedeiros 我已经尝试过使用 setFocusable(true);也用 setClickable(true),不起作用
  • GameView 是否收到 onTouchEvents ?它可以消耗它吗?
  • @IanMedeiros 如果我实现 ontouchevent 是的,但我不想在那里接收事件,我想在操纵杆视图中接收,所以我没有在游戏视图中实现,我评论了该代码
  • 这就是我的观点。我认为 SurfaceView 正在消耗 MotionEvent 并且没有向它的孩子广播?不能从 SurfaceView 通知操纵杆吗?

标签: android canvas android-canvas surfaceview ontouch


【解决方案1】:

SurfaceViews 不是ViewGroups,因此,它的行为不像普通的LinearLayout/RelativeLayout 那样将它们的事件广播给它们的子级。相反,您手动绘制它覆盖 onDraw,或者从某个外部循环调用绘制方法,对吗?仅通过您共享的代码无法推断出您是如何渲染表面视图的,但您似乎从某种控制器活动/片段中调用了此 draw() 方法,对吧?

您需要在 SurfaceView 中做的就是执行 ViewGroup 通常为您做的事情:找到所有子元素 - 我的意思是子元素是指您在 SurfaceView 区域内呈现的视图 - 并调用他们的 onTouchEvent。在您的情况下,您似乎只需要调用 Joystick touchEvent。

下面是一些示例代码:

public class GameView extends SurfaceView {

    //initialization and drawing stuff

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return joystickOnScreen.onTouchEvent(ev);
    }
}

【讨论】:

  • 谢谢,但是,如何确定摇杆是否被触摸?操纵杆在屏幕的一角,而surfaceview是整个屏幕...
猜你喜欢
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2017-01-11
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多