/ImmersionBar

实现沉浸状态栏的工具类

Primary LanguageKotlin

使用:

Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:

dependencyResolutionManagement {
	repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
	repositories {
		mavenCentral()
		maven { url 'https://jitpack.io' }
	}
}

Step 2. Add the dependency

dependencies {
        implementation 'com.github.Knightwood:ImmersionBar:Tag'
}

新方式:

注意:insets不是rect,四个值不是坐标,而是top指状态栏高度,bottom指导航栏高度,left和right表示两侧插入物宽度。

//以下两个方法都可以实现沉浸,但是在获取状态栏、导航栏高度上使用了不同的机制:

// 1.使用了 ViewCompat.setOnApplyWindowInsetsListener 设置监听事件
 * ViewCompat.setOnApplyWindowInsetsListener: 与 View 的事件分发一样,WindowInsets 的分发也是 N 叉树的遍历过程:
 * 从 N 叉树的根节点(DecoView)开始,按照 深度优先 的方式分发给 子 view。
 * Android 10 和 Android 11 两个版本官方连续修改了 ViewGroup#dispatchApplyWindowInsets() 的逻辑
 *
 * targetSdkVersion < 30 如果某个节点消费了 Insets,所有没遍历到的节点都不会收到 WindowInsets 的分发,
 * 所以旧版本无法做到两个同级的 View 同时消费 WindowInsets
 *
 * 当 app 运行在 Android 11 以上版本的设备上且 targetSdkVersion >= 30,
 * 如果某个节点消费了 Insets,该节点的所有子节点不会收到 WindowInsets 分发,但它的平级的view及其子view仍有机会消费事件。
 *
quickImmersion(window.decorView, false) {it:Insets->
	//手动更改view的margin或padding
	//更改视图的padding
	content.updatePadding(top = it.top)
	//更改margin
	content.updateLayoutParams<ViewGroup.MarginLayoutParams> {
            topMargin = systemBarInsets.top
	}
}

// 2.使用了 ViewCompat.getRootWindowInsets(view) 读取 WindowInsets从而得到状态栏或导航栏高度,不涉及监听及分发。
quickImmersion(ignoringVisibility = false) {it:Insets->
	//手动更改view的margin或padding
	//更改视图的padding
	content.updatePadding(top = it.top)
	//更改margin
	content.updateLayoutParams<ViewGroup.MarginLayoutParams> {
            topMargin = systemBarInsets.top
	}
}

//还有很多的扩展方法可以快捷的改变状态栏或导航栏的设置
例如:
//手动将状态栏设置为浅色主题,将得到深色的文字和图标
statusBarTheme(ThemeType.LIGHT)

//获取状态栏或导航栏高度
注意:该方法返回分发给视图树的原始 insets
 * Insets 只有在 view attached 才是可用的
 * API 20 及以下 永远 返回 false
 *
 * ViewCompat.getRootWindowInsets需要viewattach之后才会有用。
 *   何时才会attach:
 *   当Activity的onResume()在第一次被调用之后,View.dispatchAttachedToWindow才会被执行,也就是attached操作。
 *   因此,可以把此方法的调用放进 View.post(),或是ktx扩展库的View.doOnAttach()方法
getSystemBarInsets()

//更改屏幕亮度,范围为0~1.0,1.0时为最亮,-1为系统默认设置
windowBrightness=0.5

旧方式:

//使用默认配置并沉浸
val immersionBar = ImmersionBar()
//或者手动配置,并沉浸
ImmersionBar {
//配置
}

//重新配置,并沉浸
immersionBar.reConfig {

}.immersion()
//导航栏,与状态栏是一样的配置方式,仅名字不同
ImmersionNavBar()
ImmersionNavBar{
//配置
}