Immersive

Project Url: hacknife/Immersive
Introduction: 一行代码实现沉浸式,适配 android4.4 到 8.0+,沉浸式前所未有的简单。
More: Author   ReportBugs   
Tags:
沉浸式-

一行代码实现沉浸式,适配 android4.4 到 8.0+,沉浸式前所未有的简单。

Image Text

代码示例

使用以下方法代替 Activity.setContentView(),即可实现沉浸式。

    /**
     * @param activity 当前需要使用沉浸式的 Activity
     * @param layoutRes 当前 activity 使用的布局资源 Id
     * @param statusRes 状态栏颜色资源 Id
     * @param navigationRes 底部导航栏颜色 Id
     * @param hideStatusBar 是否隐藏状态栏
     * @param hideNavigationBar 是否隐藏导航栏
     */
    ImmersiveKt.setContentView(Activity activity, @LayoutRes int layoutRes, int statusRes, int navigationRes, boolean hideStatusBar, boolean hideNavigationBar)

动态修改状态栏颜色,前提是必须使用 ImmersiveKt.setContentView 设置布局。

    ImmersiveKt.setStatusBarColor(Activity activity, int color)

动态修改导航栏颜色,前提是必须使用 ImmersiveKt.setContentView 设置布局。

    ImmersiveKt.setNavigationBarColor(Activity activity, int color)

隐藏/展示状态栏,前提是必须使用 ImmersiveKt.setContentView 设置布局。

     ImmersiveKt.hideStatusBar(Activity activity)
     ImmersiveKt.showStatusBar(Activity activity)

隐藏/展示导航栏,前提是必须使用 ImmersiveKt.setContentView 设置布局。

     ImmersiveKt.hideNavigationBar(Activity activity)
     ImmersiveKt.showNavigationBar(Activity activity)

适配问题

如果遇见导航栏或者状态栏未显示正确,请根据机型注册 PhoneRom 修复 BUG,欢迎提交 issue,附上 PhoneRom 源码帮助更多的人适配该机型。

注册 PhoneRom

推荐在 Applicaiton.create 中注册

     Immersive.registerPhoneRom()

实现 PhoneRom , 示例

class GooglePhoneRom : PhoneRom {
    companion object {
        private const val CONTENT_KEY = "force_fsg_nav_bar"
    }

    override fun isCurrentPhoneRom() = BRAND_LOWER_CASE.contains("google")


    @RequiresApi(Build.VERSION_CODES.KITKAT)
    override fun navigationBarExist(activity: Activity): Boolean {
        return try {
            Settings.Global.getInt(activity.contentResolver, CONTENT_KEY) == 0
        } catch (e: Exception) {
            defaultPhoneRom.navigationBarExist(activity)
        }
    }
}

更多

interface PhoneRom {
    /**
     * 根据屏幕旋转角度判断当前状态所在的位置,绝大多数不用修改
     */
    fun gravityOfStatusBar(orientation: Orientation) = Gravity.TOP

    /**
     * 根据屏幕旋转角度判断当前导航所在的位置,绝大多数不用修改
     */
    fun gravityOfNavigationBar(orientation: Orientation) = when (orientation) {
        Orientation.ORIENTATION_0 -> Gravity.BOTTOM
        Orientation.ORIENTATION_90 -> Gravity.END
        Orientation.ORIENTATION_180 -> Gravity.BOTTOM
        Orientation.ORIENTATION_270 -> Gravity.START
    }

    /**
     * 判断当前 rom 是否为定义 ROM
     */
    fun isCurrentPhoneRom(): Boolean

    /**
     * 状态栏高度
     */
    fun statusBarHeight(context: Context): Int {
        return context.getSystemComponentDimen("status_bar_height")
    }

    /**
     * 导航栏高度
     */
    fun navigationBarHeight(context: Context): Int {
        return context.getSystemComponentDimen("navigation_bar_height")
    }
    /**
     * 部分手机可隐藏导航栏,是否存在
     */
    fun navigationBarExist(activity: Activity): Boolean
}

关于是否可隐藏导航栏,可根据导航栏隐藏前后,adb 指令内容区别作为判断标记

adb shell getprop ro.product.brand //查看品牌
adb shell settings list global  //查看数据库,寻找是否隐藏 navigatiuon
adb shell settings list system
adb shell settings list secure

快速引入项目

    dependencies {
                ...
            implementation 'com.iwdael:immersive:$version'
    }




感谢浏览

如果你有任何疑问,请加入 QQ 群,我将竭诚为你解答。欢迎 Star 和 Fork 本仓库,当然也欢迎你关注我。
Image Text

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools