如何在视图上禁用触摸事件?

时间:2014-08-15 10:45:27

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

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

我在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);

一旦所有内容都加载完毕,我只需删除(splashscreen)视图即可显示下面的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)

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

1 个答案:

答案 0 :(得分:1)

通常,您需要启动画面以防止用户在存在时执行任何操作。实际上你可以这样做,因为在其他UI框架中,android中的视图具有触摸事件级联的层次结构。

即使您不希望启动画面具有交互性,您仍然可以窃取其上发生的所有触摸事件,并且不会对它们执行任何操作。答案本身是使用以下内容覆盖onTouchEvent课程中的SplashScreen

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

在此返回true基本上表示此视图下的任何内容都不应接收触摸事件。只要它是可见的并且在表面视图的顶部,您的表面视图将不会获得任何触摸事件。有关详细信息,请参阅here