版权声明:富就富在不知足,贵就贵在能脱俗。贫就贫在少见识,贱就贱在没骨气。 https://blog.csdn.net/qq_33544860/article/details/78293160
项目需求:在全屏模式下不能显示状态栏/虚拟按键
说白点:全屏模式下不能下拉
因为是在MTK平台研发,离不开源码。。。。
这里不做逻辑解释:
参照网上大神说法:MTK 内部已经开发提供新的接口来实现全屏界面禁止下拉状态栏
4.4平台上的做法:
1. frameworks\base\core\java\android\view\View.java上
- + /**
- + * @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 = 0x00002000;
2. frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
- mSystemGestures = new SystemGesturesPointerEventListener(context,
- new SystemGesturesPointerEventListener.Callbacks() {
- @Override
- public void onSwipeFromTop() {
- + if (isGestureIsolated())
- + return;
- if (mStatusBar != null) {
- requestTransientBars(mStatusBar);
- }
- }
- @Override
- public void onSwipeFromBottom() {
- + if (isGestureIsolated())
- + return;
- if (mNavigationBar != null && mNavigationBarOnBottom) {
- requestTransientBars(mNavigationBar);
- }
- }
- @Override
- public void onSwipeFromRight() {
- + if (isGestureIsolated())
- + return;
- if (mNavigationBar != null && !mNavigationBarOnBottom) {
- requestTransientBars(mNavigationBar);
- }
- }
- @Override
- public void onDebug() {
- // no-op
- }
- + private boolean isGestureIsolated() {
- + WindowState win = mFocusedWindow != null ? mFocusedWindow : mTopFullscreenOpaqueWindowState;
- + if (win != null && (win.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED) != 0)
- + return true;
- + else
- + return false;
- + }
- });
对比了一下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暂时不去处理
针对该问题做出如下修改:(看图 不说话)
测试完美解决: