Android全面屏启动页适配的一些坑

全面屏适配的坑

1、关于全面屏适配的一些基本知识点

我所以写这篇文章是因为这个坑一般人不一定能发现,在解决过程中也百度了很多资料,都没有找到答案,最后是我机缘巧合解决掉了,其中的原理知识大致理解不一定深。网上关于全面屏适配的资料有很多,这里给大家介绍一个。大家自己去看:https://blog.csdn.net/guolin_blog/article/details/51763825

2、坑

很多人也许和我一样就是在应用启动特别慢的情况下(Application耗时时间比较长),会用一张图片应用到启动Activity的Theme上,就像下面这样,来达到一点应用图标及打开应用的效果,不会出现白屏和黑屏的现象。网上说是冷启动优化,其实就是自己骗自己,治标不治本的方法。

<application
        android:name=".App"
        android:largeHeap="true"
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:theme="@style/MainTheme"
            android:windowSoftInputMode="adjustPan"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--region 适配全面屏-->
        <meta-data
            android:name="android.max_aspect"
            android:value="2.4" />
        <!--endregion-->
    </application>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@mipmap/iv_startup</item>
    </style>
</resources>

乍一看这么写完全没有问题,android:windowTranslucentNavigation和android:windowTranslucentStatus都设置为true之后,android:navigationBarColor和android:statusBarColor设置为透明之后,就应该只展现图片了啊,不会有啥状态栏和导航栏。


而实际展现出来的启动页效果是这样的,虚拟按钮背景照样是浅灰色。



网上查的那些资料说什么在Activity里onCreate()、onWindowFocusChanged()或者在Application里设置ActivityLifecycleCallbacks监听,然后在onActivityCreated()用代码设置沉浸式效果,隐藏状态栏和导航栏。这个我想说,根本不适用我这个场景,这个是启动图,Application的onCreate()都没有走完,这个图片就已经展现出来了,代码控制压根没用。

还有的资料说是添加这行代码

<item name="android:fitsSystemWindows">true</item>

还有资料说应用这个样式

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
        <item name="android:windowBackground">@mipmap/iv_startup</item>
    </style>
</resources>

第一个压根没有用,在刚启动的时候和上图一样的效果虚拟导航键是浅灰色的,然后走进启动Activity之后,图片完全就被顶上去了,让出了底部虚拟按钮的区域,都被挤变形了。


第二个设置了压根没有用,android:windowDrawsSystemBarBackgrounds这个属性如果设置为true,那么图片不会被压缩比例,但是会被虚拟导航键挡住。可以理解为虚拟导航键布局浮动在启动图上,启动图全屏充满。并且虚拟导航栏使用的是默认样式。


如果设置为false,则图片会被展示全部,但是图片会避开虚拟导航键那部分区域不会全屏充满,会被压缩比例展示,这个也是默认属性。如果没有虚拟导航栏那其实就能满足我的要求,但是有的全面屏机型虚拟导航栏是自己设置的,小米手机设置-全面屏-切换,而这个导航键如果不做处理,应用里是一直存在的。


这个就很坑了,坑在哪里?在这一行

<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowTranslucentStatus">true</item>

对罪魁元首就是这2行,我是怎么解决这个问题的,很简单。把这2行删掉就行了。就是应用下面的样式:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <!--windowTranslucentNavigation这个属性设置成true,则navigationBarColor设置会失效-->
        <!--<item name="android:windowTranslucentNavigation">true</item>-->
        <!--<item name="android:windowTranslucentStatus">true</item>-->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@mipmap/iv_startup</item>
    </style>
</resources>

原因是什么?就是Android如果设置过android:windowTranslucentNavigation和android:windowTranslucentStatus为true之后,android:navigationBarColor和android:statusBarColor都不会生效,默认使用Android自带的样式,我的模拟器表现就是浅灰色。


以上都看完之后,相信大家大致明白了该怎么去适配冷启动图片设置android:navigationBarColor不起效果的BUG,但是还有一个就是大家,一定要注意,这也是网上全面屏教程都没有涉及到的知识点,就是targetSdkVersion一点要大于等于21,否则你让应用怎么去适配全面屏和沉浸式所属的样式???

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.foutch.xyz.myapplication"
        minSdkVersion 16
        //targetSdkVersion需要>=21,要不然应用不了V21版本的样式
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

DEMO链接: https://pan.baidu.com/s/1_byrlvhEbOHPFUQslZ62SQ

密码: d3rb

3、关于作者

掘金:https://juejin.im/user/5a2b6b306fb9a04522076dd0/posts
简书:https://www.jianshu.com/u/7566e4604f87
GitHub:https://github.com/RmondJone

微信图片_20181024114409.jpg

微信图片_20181024114416.jpg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 原文链接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影阅读 32,899评论 6 472
  • 丈:十尺也;夫:成年男子也;大丈夫:身高一丈之成年男子也。这是古代中国大丈夫的源出。可他的衍生源自《孟子·滕文公下...
    美丽的井沟村折川社神话阅读 1,588评论 0 6
  • 昨晚喝的有点多,早起来胃就不舒服,吃过早饭感觉好些了。 等了一会儿,杨胜回去一趟后和我一起去爬琅琊山,告诉我说欧阳...
    晓谈阅读 234评论 0 0