解决Android类似华为的虚拟键/ActionBar/全屏/沉浸式状态栏

   我们在开发Android 的时候,尤其是适配,是真心觉得Android 头大,①各种状态栏,②小米的悬浮框权限会导致系统级别的WindowManager加载的view 不显示,尤其是Mi 5,Mi 6,③华为的虚拟按键,④魅族手机使用Videovie控件,会在魅族手机底部产黑条 ⑤ 华为手机插入USB 数据线通讯的时候,点击弹窗 是,则导致 不能正常通讯,必须点击否 采用Google 的AOA 协议 才可以避免弹窗提示!

   看看,每个学Android 的人 都是天使,和IOS 那适配比起来,IOS 省了好多 机型适配的问题。

进入正题!

/*************************************************************************************

1.动态全屏显示

@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
setFullSreenMode();
}
/**
* <P>Carplay 全屏显示</P>
*/
private void setFullSreenMode() {
int vis =
View.SYSTEM_UI_FLAG_FULLSCREEN | //全屏显示
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
getWindow().getDecorView().setSystemUiVisibility(vis);
}

2.在原生的Android 中,无法使用androidx等包自带的Them,并且修改v4,v7包代价大,或者无法修改的。

如下实例:

<style name="AppTheme" parent="android:Theme.Black">

第二个无法再V4,V7包下加载使用,因为这个是androidx自带的主题

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

想要实现对状态栏的一些操作,就只能琢磨自带属性

1. <item name="android:windowFullscreen">true</item>   //可以实现全屏

2. <item name="android:windowNoTitle">true</item> //可以实现没有标题栏,默认为灰色细条条标题栏

3.  <item name="android:windowBackground">@drawable/app_background</item>  //设置为APP init时候的背景图

4.  <item name="android:windowTranslucentNavigation">true</item> //可以非全屏模式下的透明导航栏 ,(除了全屏之外,这应该是最需要的一个)

/*************************************************************************************

1.状态栏的问题就很好解决,如果为了到达全屏!

首先去掉状态栏

 

  <activity
            android:name="com.gdu.mvp_view.ZorroRealControlActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

 

  <style name="Theme.NoTitleBar.Fullscreen">
        <item name="windowFullscreen">true</item>
        <item name="windowContentOverlay">@null</item>
    </style>


就可以去掉了!

 

 2.解决下方的虚拟按键NavigationBar

 ①首先判断是否有虚拟按钮

 

/**
     * <P>shang</P>
     * <P>判断是否有虚拟按键</P>
     * @param context
     * @return
     */
    public static boolean checkDeviceHasNavigationBar(Context context) {
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
                hasNavigationBar = true;
            }
        } catch (Exception e) {
        }
        return hasNavigationBar;
    }


②就是开始去掉虚拟按键

 

 

 @Override
    protected void onResume() {
    
        //解决 虚拟按键问题
        solveNavigationBar(getWindow());
}
   /**
     * <P>shang</P>
     * <P>解决虚拟按键问题</P>
     * @param window
     */
    public void solveNavigationBar(Window window){
        
        //保持布局状态
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE|
                //布局位于状态栏下方
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|
                //全屏
                View.SYSTEM_UI_FLAG_FULLSCREEN|
                //隐藏导航栏
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
        if (Build.VERSION.SDK_INT>=19){
            uiOptions |= 0x00001000;
        }else{
            uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
        }
        window.getDecorView().setSystemUiVisibility(uiOptions);
    }


实测有效!如上图Gif,达到王者荣耀 游戏界面效果!

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值