【问题标题】:How to disable touch events on a View?如何禁用视图上的触摸事件?
【发布时间】:2014-08-16 04:47:10
【问题描述】:

我的 (OpenGL ES 2.0) 应用有一个启动画面,它基本上是一个 Android View,显示在我的 GLSurfaceView 上。

我在 AsyncTask 上完成所有初始设置,然后(非必要)在 onSurfaceCreated 的 GLRendering 线程上加载我的位图/纹理。加载完所有内容后,我会关闭启动画面。

除了一件事之外,一切都按预期工作。闪屏仍然接受输入,如果在应用程序启动后触摸屏幕,我(显然)会得到一个空指针异常。

我只是像这样创建我的视图:

splashscreen = new SplashScreen(getApplication(), width, height);  //Where SplashScreen is a custom class that extends View

然后我将它添加到我的布局中,如下所示:

layout.add(myView);        //My GLSurfaceView
layout.add(splashscreen);  //The splashscreen View
setContectView(layout);

加载完所有内容后,我只需删除(启动画面)视图即可在下面显示我的 GLSurfaceView:

layout.removeView(splashscreen);
splashscreen=null;  //Null it

目前,在我的 onTouch 方法中,为了解决这个问题,我已经像这样进行了检查:

public boolean onTouchEvent(MotionEvent event) {

    if(splashscreen==null){
    //Do touch related stuff here
    }

    return true;

}

这确实有效,但是,我确信这不是实现我所追求的最干净的方式。

我试过了:

splashscreensetClickable(false);

layout.setClickable(false);

以及setEnabled(false)

似乎没有任何效果,但我确定一定有办法做到这一点......

【问题讨论】:

  • 你能澄清几件事吗? “闪屏仍然接受输入,如果在应用程序启动后触摸屏幕,我(显然)得到一个空指针异常。”为什么你希望你的闪屏在它时不阻止触摸输入是可见的?为什么会发生这种 NPE?
  • 嗨@TrevorSiemens,启动画面根本不应该接受输入。没有理由这样做。用户可以在加载所有内容时按下主页按钮,如果他们想退出。但是,启动画面不应该是“交互式的”。发生空指针是因为一旦按下屏幕,它就会开始运行应用程序并调用 GLRenderer,它试图对尚不存在的对象采取行动......希望这是有道理的 :-) 然而,这足以知道闪屏不应该接受输入,因此应该禁用它!
  • 我在想几件事:即使启动画面不应该是“交互式”的,它仍然应该接受触摸输入。它根本不应该对它做任何事情。您可以通过覆盖初始屏幕的 onTouchEvent 来做到这一点,并简单地返回 true。这将允许它阻止下面视图上的触摸事件,但不会发生任何事情。
  • 感谢@TrevorSiemens,这非常有效!我必须承认,我仍然不完全确定它为什么会起作用,我猜测覆盖 onTouchEvent 只是“收集”此视图(启动屏幕)的触摸事件,而没有这个,它将触摸事件传递给 Main Activiy onTouch 方法??如果您想将此作为答案,我会接受!谢谢:-)

标签: java android touch opengl-es-2.0 ontouchlistener


【解决方案1】:

一般来说,您会希望启动画面阻止用户在它出现时执行任何操作。您实际上可以这样做,因为 android 中的视图与其他 UI 框架中的视图一样,有一个层次结构,触摸事件在其中级联。

即使您不希望启动画面具有交互性,您仍然可以窃取其上发生的所有触摸事件,而对它们不做任何处理。答案本身是在你的SplashScreen 类中覆盖onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent event) {
    return true; // Splash screen is consuming all touch events on it.
}

在此返回true 基本上表示此视图下的任何内容都不应接收触摸事件。只要它是可见的并且在表面视图之上,你的表面视图就不会得到任何触摸事件。详情请见here

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多