Android 如果调用SetSystemMiviability(View.SYSTEM\u UI\u FLAG\u HIDE\u NAVIGATION),则不会触发onTouchEvent()

Android 如果调用SetSystemMiviability(View.SYSTEM\u UI\u FLAG\u HIDE\u NAVIGATION),则不会触发onTouchEvent(),android,Android,我打电话 当我的应用程序开始使我的应用程序能够全屏显示时 我希望我的应用程序的UI在触摸屏幕时弹出,但在第二次触摸屏幕之前,Activity.onTouchEvent()不会被触发。第一次触摸时,仅显示虚拟键 因此,我必须触发我的应用程序的UI弹出 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) 但是onsystemivilitychange带有视图。系统每次触摸(在我

我打电话

当我的应用程序开始使我的应用程序能够全屏显示时


我希望我的应用程序的UI在触摸屏幕时弹出,但在第二次触摸屏幕之前,
Activity.onTouchEvent()
不会被触发。第一次触摸时,仅显示虚拟键

因此,我必须触发我的应用程序的UI弹出

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) 
但是
onsystemivilitychange
带有
视图。系统每次触摸(在我的Galaxy Nexus上为3次)都不会调用SYSTEM\u UI\u FLAG\u VISIBLE
,特别是当用户非常快/经常触摸屏幕时

项目库4.0或4.03。
三星galaxy(9250)4.03版。

您是否尝试添加代码以仅在状态更改时显示UI?您必须保持最后一次已知的可见性,并且仅在第一次可见时显示UI:

public void onSystemUiVisibilityChange(int visibility) {
    if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
         // show my APP UI
    }
}

从中采用的代码示例方法Activity.onTouchEvent()在响应程序链的端调用(意味着在所有其他视图都有机会使用事件之后)。如果您点击对触摸感兴趣的视图(即
按钮
编辑文本
),您的活动很有可能永远看不到该事件

如果您希望在每次将触摸发送到您的视图之前访问触摸,请改为覆盖
活动。dispatchTouchEvent()
,这是在事件链的开头调用的方法:

int mLastSystemUiVis;

@Override 
public void onSystemUiVisibilityChange(int visibility) {
    int diff = mLastSystemUiVis ^ visibility;
    mLastSystemUiVis = visibility;
    if ((diff&SYSTEM_UI_FLAG_VISIBLE) != 0
            && (visibility&SYSTEM_UI_FLAG_VISIBLE) == 0) {
        // DISPLAY YOUR UI
    }
}

注意不要覆盖此方法的返回值,除非您有意从其余视图中窃取接触,否则不必要的
返回true将中断其他触摸处理。

我也遇到了此问题,我发现了此问题


所以,没办法帮忙。甚至安卓系统打包的Gallery应用程序也在照片页面视图中使用system_UI_FLAG_LOW_PROFILE而不是system_UI_FLAG_HIDE_导航。这至少是我们所能做的。

我遇到了一个非常类似的问题,那就是试图从一个需要两次触摸的
onTouchEvent()更新UI,我尝试了一系列精心制作的东西,最后在第一次点击时就开始工作了

在我的例子中,我显示了一个以前隐藏的项目,然后得到它的高度,然后将一个按钮向下移动该高度。我遇到的问题是,在第一次触摸事件完成之前,高度一直显示为0。我可以通过在
ACTION\u UP
期间为
onTouchEvent()调用show()来解决这个问题,而不是调用它的
ACTION\u DOWN
。如果你做了类似的事情,也许会有用?

尝试使用:

getWindow().getDecorView().SetSystemActivity(View.GONE)

相反:

getWindow().getDecorView().SetSystemActivity(视图、系统、用户界面、标志、隐藏、导航)

之后,您可以在全屏上使用正常活动,如果您想要导航键,则需要从下向上滑动。在使用android 4.1.2的Galaxy Tab 2上为我工作这确实对我有用:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    //Check the event and do magic here, such as...
    if (event.getAction() == MotionEvent.ACTION_DOWN) {

    }

    //Be careful not to override the return unless necessary
    return super.dispatchTouchEvent(event);
}

我首先导入了android.view.GestureDetector,这样我就可以用它来检测手势了。Android有许多默认手势,这些手势会在浏览器中自动检测到。大部分信息都可以找到,但下面是我在实际项目中使用过的一种形式的代码

首先,我在活动中创建了一个匿名类(可以嵌套在任何地方,但我倾向于在底部创建匿名类,就在右括号之前)。注意:您还可以将
OnTestureListener
实现为类的一部分

下面的代码用于使用手势检测进行简单的隐藏/显示

我已经将我的操作栏(我的UI,它最初是隐藏的)声明并定义为实例变量,因此我可以在这里和其他任何地方访问它,但是如果您不想将其声明为实例变量,可以将其替换为
getActionBar().show()
getActionBar().hide()
。将您的UI替换为
操作栏

 setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if ((visibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
                // show my app UI
            }
        }
    });
然后,在我的
onCreate()
中,我声明了我的
GestureDetector
,并且(可选)设置了我的
GestureListeners

public class Example extends ActionBarActivity {

    // declared in onCreate() method
    private android.support.v7.app.ActionBar actionBar; 
    private GestureDetectorCompat mDetector;
    private YourView view1;
    private YourView view2;
    private YourView view3;
    private YourView view4;

    // some other code

    class GestureListener extends GestureDetector.SimpleOnGestureListener {

    private static final String DEBUG_TAG = "Gestures in Example Class";

        @Override
        public boolean onDoubleTap(MotionEvent event) {

            Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
            // if there is a double tap, show the action bar
            actionBar.show();

            return true;
       }

       @Override
       public boolean onSingleTapConfirmed(MotionEvent event) {

            Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());

            // if the tap is below the action bar, hide the action bar
            if (event.getRawY() > getResources().getDimension(R.dimen.abc_action_bar_default_height)) {
                actionBar.hide();
                return true;
            }

            return false;
        }

        @Override
        public boolean onDown(MotionEvent event) {

             return true;

        }

} // end-of-Example Class
然后,为了实际发送要处理的手势,我们提供了操作说明,我知道有两种方法,第一种是最简单的:

private GestureDetectorCompat mDetector;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // some code here
    mDetector = new GestureDetectorCompat(this, new GestureListener());

    // this code is for more advanced view logic not needed for a basic set-up
    //setGestureListeners();

} // end-of-method onCreate()
第二种方法更复杂,但如果您只想识别布局中某些
视图
上的触摸事件,就像您有重叠视图并且只能访问顶部
视图
一样,则可以创建自定义类来传递事件:

/**
* This method recognizes a touchEvent and passes it to your custom GestureListener 
* class.
*/
@Override 
public boolean onTouchEvent(MotionEvent event){

     this.mDetector.onTouchEvent(event);

     return super.onTouchEvent(event);
}
然后在这里使用它:

class MyOnTouchListener implements View.OnTouchListener {

    public boolean onTouch(View v, MotionEvent event) {

        if (v.equals(view4)) {
            return mDetector.onTouchEvent(event);   
        } else return false;
    }
} // end-of-class MyOnTouchListener
在我的
setgestureelisteners
方法中,我给了他们所有相同的命令集,基本上只识别
view4
上的触摸事件。否则,它只是将touchEvent传递给下一个视图


这是使用
AppCompat
编写的代码,但如果您不是为旧版本开发,您可以使用常规的
GestureDetector
ActionBar
,Android 4.4(API级别19)为
设置系统兼容性()
引入一个新的
系统UI\u沉浸式
标志,让您的应用程序真正运行起来“全屏。“此标志与
SYSTEM\u UI\u flag\u HIDE\u导航
SYSTEM\u UI\u flag\u全屏
标志结合使用时,会隐藏导航栏和状态栏,并让您的应用程序捕获屏幕上的所有触摸事件。

。虫子?我也是。这是因为我无法在视频视图中使用手势。第一次触摸时,仅显示虚拟键。---应用程序的UI是否有EditText?否。问题是“仅显示虚拟键”。我需要调用under元素的onTouch(),或者至少不要在第二次触摸中多次调用。这方面有更新吗?我还需要触发onTouch()。第一次接触是consum
public void setGestureListeners() {

    /* when we return false for any of these onTouch methods
    * it means that the the touchEvent is passed onto the next View.
    * The order in which touchEvents are sent to are in the order they
    * are declared.
    */
    view1.setOnTouchListener(new MyOnTouchListener());

    view2.setOnTouchListener(new MyOnTouchListener());

    view3.setOnTouchListener(new MyOnTouchListener());

    view4.setOnTouchListener(new MyOnTouchListener());


} // end-of-method setGestureListeners()