全屏模式下不能下拉 上滑(mtk)

版权声明:富就富在不知足,贵就贵在能脱俗。贫就贫在少见识,贱就贱在没骨气。 https://blog.csdn.net/qq_33544860/article/details/78293160

项目需求:在全屏模式下不能显示状态栏/虚拟按键

说白点:全屏模式下不能下拉

因为是在MTK平台研发,离不开源码。。。。


这里不做逻辑解释:


参照网上大神说法:MTK 内部已经开发提供新的接口来实现全屏界面禁止下拉状态栏

4.4平台上的做法:

1. frameworks\base\core\java\android\view\View.java上

  1. +    /** 
  2. +     * @hide 
  3. +     * 
  4. +     * NOTE: Flag for {@link #setSystemUiVisibility(int)}: It help user to disable transient 
  5. +     * status bar triggered by gesture 
  6. +     */  
  7. +    public static final int SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED = 0x00002000;

2. frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java

  1.         mSystemGestures = new SystemGesturesPointerEventListener(context,  
  2.                 new SystemGesturesPointerEventListener.Callbacks() {  
  3.                     @Override  
  4.                     public void onSwipeFromTop() {  
  5. +                        if (isGestureIsolated())  
  6. +                            return;  
  7.                         if (mStatusBar != null) {  
  8.                             requestTransientBars(mStatusBar);  
  9.                         }  
  10.                     }  
  11.                     @Override  
  12.                     public void onSwipeFromBottom() {  
  13. +                        if (isGestureIsolated())  
  14. +                            return;  
  15.                         if (mNavigationBar != null && mNavigationBarOnBottom) {  
  16.                             requestTransientBars(mNavigationBar);  
  17.                         }  
  18.                     }  
  19.                     @Override  
  20.                     public void onSwipeFromRight() {  
  21. +                        if (isGestureIsolated())  
  22. +                            return;                     
  23.                         if (mNavigationBar != null && !mNavigationBarOnBottom) {  
  24.                             requestTransientBars(mNavigationBar);  
  25.                         }  
  26.                     }  
  27.                     @Override  
  28.                     public void onDebug() {  
  29.                         // no-op  
  30.                     }  
  31. +                    private boolean isGestureIsolated() {  
  32. +                        WindowState win = mFocusedWindow != null ? mFocusedWindow : mTopFullscreenOpaqueWindowState;  
  33. +                        if (win != null && (win.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED) != 0)  
  34. +                            return true;  
  35. +                        else  
  36. +                            return false;  
  37. +                    }  
  38.                 }); 

对比了一下6.0版本:区别不大


在6.0上就是修改了SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED的变量值:


    /**
     * @hide
     *
     * NOTE: Flag for {@link #setSystemUiVisibility(int)}: It help user to disable transient
     * status bar triggered by gesture
     */
    public static final int SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED = 0x00004000;


使用方法:

Demo:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if( hasFocus ) {
            ScreenFull();
        }
    }
    private void ScreenFull() {
        // TODO Auto-generated method stub
        final View decorView = getWindow().getDecorView();
        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | 0x00004000;                               //SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        decorView.setSystemUiVisibility(flags);

        decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                    decorView.setSystemUiVisibility(flags);
                }
            }
        });
    }
}

20171102 使用测试发现一个问题:全屏模式下 配置该属性 导致需要按2下Home才能退出到桌面

因而 
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
该属性,存在的Bug暂时不去处理

针对该问题做出如下修改:(看图 不说话)




测试完美解决:




 
 

猜你喜欢

转载自blog.csdn.net/qq_33544860/article/details/78293160