我的(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)
似乎没有任何效果,但我肯定必须有办法做到这一点.......
答案 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。