From 1499142e215169b18fed1182ef6ac9c665a05b52 Mon Sep 17 00:00:00 2001 From: Zackratos <869649338@qq.com> Date: Thu, 7 Jan 2021 19:08:00 +0800 Subject: [PATCH] modify getStatusBarHeight and getNavigationBarHeight method, fixes #21 --- .../library/UltimateBarXExposed.kt | 6 ++++-- .../library/UltimateBarXManager.kt | 21 ------------------- .../ultimatebarx/library/core/UltimateBarX.kt | 18 +++++++++------- .../ultimatebarx/library/extension/Context.kt | 12 +++++++++++ .../ultimatebarx/library/rom/BaseRom.kt | 7 +++++++ .../ultimatebarx/library/rom/MiuiRom.kt | 9 ++++++++ .../library/view/FrameLayoutCreator.kt | 10 +++++---- .../library/view/RelativeLayoutCreator.kt | 10 +++++---- .../library/view/ViewGroupCreator.kt | 6 ++++-- 9 files changed, 58 insertions(+), 41 deletions(-) diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXExposed.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXExposed.kt index 027bdcd..eec7654 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXExposed.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXExposed.kt @@ -5,6 +5,8 @@ import android.os.Build import android.view.View import com.zackratos.ultimatebarx.library.core.addNavigationBarBottomPadding import com.zackratos.ultimatebarx.library.core.addStatusBarTopPadding +import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight +import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight /** * @Author : zhangwenchao @@ -12,9 +14,9 @@ import com.zackratos.ultimatebarx.library.core.addStatusBarTopPadding * @email : 869649338@qq.com * @Describe : */ -fun Context.getStatusBarHeight() = UltimateBarXManager.getInstance().getStatusBarHeight(this) +fun Context.getStatusBarHeight() = getStatusBarHeight() -fun Context.getNavigationBarHeight() = UltimateBarXManager.getInstance().getNavigationBarHeight(this) +fun Context.getNavigationBarHeight() = getNavigationBarHeight() fun View.addStatusBarTopPadding() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) addStatusBarTopPadding() diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXManager.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXManager.kt index 9cb6534..382e113 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXManager.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/UltimateBarXManager.kt @@ -1,6 +1,5 @@ package com.zackratos.ultimatebarx.library -import android.content.Context import android.graphics.Color import android.os.Build import androidx.annotation.ColorInt @@ -10,9 +9,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LifecycleOwner import com.zackratos.ultimatebarx.library.bean.BarConfig -import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight import com.zackratos.ultimatebarx.library.extension.getRom -import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight import com.zackratos.ultimatebarx.library.rom.Rom import java.lang.reflect.Field @@ -33,24 +30,6 @@ internal class UltimateBarXManager private constructor(){ internal val rom: Rom by lazy { getRom() } - private var statusBarHeight: Int = -1 - - internal fun getStatusBarHeight(context: Context): Int { - if (statusBarHeight < 0) { - statusBarHeight = context.getStatusBarHeight() - } - return statusBarHeight - } - - private var navigationBarHeight: Int = -1 - - internal fun getNavigationBarHeight(context: Context): Int { - if (navigationBarHeight < 0) { - navigationBarHeight = context.getNavigationBarHeight() - } - return navigationBarHeight - } - internal val fragmentViewFiled: Field by lazy { Fragment::class.java.getDeclaredField("mView").apply { isAccessible = true } } // 保存 Activity 的 StatusBar 是否设置过 private val staDefMap: MutableMap by lazy { ArrayMap() } diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/core/UltimateBarX.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/core/UltimateBarX.kt index 113819e..2e545be 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/core/UltimateBarX.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/core/UltimateBarX.kt @@ -16,6 +16,8 @@ import com.zackratos.ultimatebarx.library.UltimateBarXObserver import com.zackratos.ultimatebarx.library.bean.BarConfig import com.zackratos.ultimatebarx.library.extension.barTransparent import com.zackratos.ultimatebarx.library.extension.getColorInt +import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight +import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight import com.zackratos.ultimatebarx.library.view.* /** @@ -195,7 +197,7 @@ private fun ViewGroup.getCreator(tag: Tag): Creator { private fun ViewGroup.setStatusBarPadding(context: Context, fitWindow: Boolean) { setPadding( paddingLeft, - if (fitWindow) manager.getStatusBarHeight(context) else 0, + if (fitWindow) context.getStatusBarHeight() else 0, paddingRight, paddingBottom ) @@ -206,7 +208,7 @@ private fun ViewGroup.setNavigationBarPadding(context: Context, fitWindow: Boole paddingLeft, paddingTop, paddingRight, - if (fitWindow) manager.getNavigationBarHeight(context) else 0 + if (fitWindow) context.getNavigationBarHeight() else 0 ) } @@ -225,15 +227,15 @@ private fun View.updateBackground(config: BarConfig) { */ @RequiresApi(Build.VERSION_CODES.KITKAT) internal fun View.addStatusBarTopPadding() { - setPadding(paddingLeft, paddingTop + manager.getStatusBarHeight(context), paddingRight, paddingBottom) + setPadding(paddingLeft, paddingTop + context.getStatusBarHeight(), paddingRight, paddingBottom) val lp = layoutParams if (lp.height != ViewGroup.LayoutParams.MATCH_PARENT && lp.height != ViewGroup.LayoutParams.WRAP_CONTENT) { - lp.height += manager.getStatusBarHeight(context) + lp.height += context.getStatusBarHeight() layoutParams = lp return } post { - lp.height = height + manager.getStatusBarHeight(context) + lp.height = height + context.getStatusBarHeight() layoutParams = lp } } @@ -248,15 +250,15 @@ internal fun View.addNavigationBarBottomPadding() { if (ctx is FragmentActivity && !manager.rom.navigationBarExist(ctx)) { return } - setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom + manager.getNavigationBarHeight(context)) + setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom + context.getNavigationBarHeight()) val lp = layoutParams if (lp.height != ViewGroup.LayoutParams.MATCH_PARENT && lp.height != ViewGroup.LayoutParams.WRAP_CONTENT) { - lp.height += manager.getNavigationBarHeight(context) + lp.height += context.getNavigationBarHeight() layoutParams = lp return } post { - lp.height = height + manager.getNavigationBarHeight(context) + lp.height = height + context.getNavigationBarHeight() layoutParams = lp } } \ No newline at end of file diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/extension/Context.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/extension/Context.kt index 2a100f5..12a87ef 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/extension/Context.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/extension/Context.kt @@ -1,8 +1,12 @@ package com.zackratos.ultimatebarx.library.extension import android.content.Context +import android.graphics.Point +import android.os.Build +import android.view.WindowManager import androidx.annotation.ColorInt import androidx.annotation.ColorRes +import androidx.annotation.RequiresApi import androidx.core.content.ContextCompat /** @@ -21,3 +25,11 @@ internal fun Context.getNavigationBarHeight() = getBarHeight("navigation_bar_hei @ColorInt internal fun Context.getColorInt(@ColorRes colorRes: Int): Int = ContextCompat.getColor(this, colorRes) + +@RequiresApi(Build.VERSION_CODES.KITKAT) +internal fun Context.getScreenHeight(): Int { + val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager + val point = Point() + wm.defaultDisplay.getRealSize(point) + return point.y +} \ No newline at end of file diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/rom/BaseRom.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/rom/BaseRom.kt index fb1fb3a..7e5cf8c 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/rom/BaseRom.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/rom/BaseRom.kt @@ -16,6 +16,9 @@ abstract class BaseRom: Rom { @RequiresApi(Build.VERSION_CODES.KITKAT) override fun navigationBarExist(activity: FragmentActivity): Boolean { if (fullScreenGestureOn(activity)) { + if (screenIndicatorOn(activity)) { + return true + } return false } return activity.commonNavigationBarExist() @@ -25,4 +28,8 @@ abstract class BaseRom: Rom { @RequiresApi(Build.VERSION_CODES.KITKAT) protected abstract fun fullScreenGestureOn(activity: FragmentActivity): Boolean + // 是否开启了手势提示线 + @RequiresApi(Build.VERSION_CODES.KITKAT) + protected open fun screenIndicatorOn(activity: FragmentActivity): Boolean = false + } \ No newline at end of file diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/rom/MiuiRom.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/rom/MiuiRom.kt index 1083fa3..dd6805f 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/rom/MiuiRom.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/rom/MiuiRom.kt @@ -4,6 +4,8 @@ import android.os.Build import android.provider.Settings import androidx.annotation.RequiresApi import androidx.fragment.app.FragmentActivity +import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight +import com.zackratos.ultimatebarx.library.extension.getScreenHeight /** * @Author : zhangwenchao @@ -17,4 +19,11 @@ internal class MiuiRom: BaseRom() { override fun fullScreenGestureOn(activity: FragmentActivity): Boolean { return Settings.Global.getInt(activity.contentResolver, "force_fsg_nav_bar", -1) > 0 } + + @RequiresApi(Build.VERSION_CODES.KITKAT) + override fun screenIndicatorOn(activity: FragmentActivity): Boolean { + val navigationBarHeight = activity.getNavigationBarHeight() + val screenHeight = activity.getScreenHeight() + return navigationBarHeight > 0 && screenHeight / navigationBarHeight > 30 + } } \ No newline at end of file diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/view/FrameLayoutCreator.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/view/FrameLayoutCreator.kt index 7bca76c..477b57f 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/view/FrameLayoutCreator.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/view/FrameLayoutCreator.kt @@ -6,6 +6,8 @@ import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.widget.FrameLayout +import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight +import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight /** * @Author : Zackratos @@ -21,7 +23,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag statusBar = View(context).apply { layoutParams = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - manager.getStatusBarHeight(context) + context.getStatusBarHeight() ).apply { gravity = Gravity.TOP } } statusBar.tag = tag.statusBarViewTag() @@ -30,7 +32,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag statusBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { statusBar.layoutParams = (statusBar.layoutParams as FrameLayout.LayoutParams) - .apply { topMargin = if (fitWindow) -manager.getStatusBarHeight(context) else 0 } + .apply { topMargin = if (fitWindow) -context.getStatusBarHeight() else 0 } statusBar.viewTreeObserver.removeGlobalOnLayoutListener(this) } }) @@ -43,7 +45,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag navigationBar = View(context).apply { layoutParams = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - manager.getNavigationBarHeight(context) + context.getNavigationBarHeight() ).apply { gravity = Gravity.BOTTOM } } navigationBar.tag = tag.navigationBarViewTag() @@ -52,7 +54,7 @@ internal class FrameLayoutCreator(private val frameLayout: FrameLayout, tag: Tag navigationBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { navigationBar.layoutParams = (navigationBar.layoutParams as FrameLayout.LayoutParams) - .apply { bottomMargin = if (fitWindow) -manager.getNavigationBarHeight(context) else 0 } + .apply { bottomMargin = if (fitWindow) -context.getNavigationBarHeight() else 0 } navigationBar.viewTreeObserver.removeGlobalOnLayoutListener(this) } }) diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/view/RelativeLayoutCreator.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/view/RelativeLayoutCreator.kt index 04db87f..1eea2bb 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/view/RelativeLayoutCreator.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/view/RelativeLayoutCreator.kt @@ -5,6 +5,8 @@ import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.widget.RelativeLayout +import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight +import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight /** * @Author : Zackratos @@ -20,7 +22,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout, statusBar = View(context).apply { layoutParams = RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - manager.getStatusBarHeight(context) + context.getStatusBarHeight() ).apply { addRule(RelativeLayout.ALIGN_PARENT_TOP) } } statusBar.tag = tag.statusBarViewTag() @@ -29,7 +31,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout, statusBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { statusBar.layoutParams = (statusBar.layoutParams as RelativeLayout.LayoutParams) - .apply { topMargin = if (fitWindow) -manager.getStatusBarHeight(context) else 0 } + .apply { topMargin = if (fitWindow) -context.getStatusBarHeight() else 0 } statusBar.viewTreeObserver.removeGlobalOnLayoutListener(this) } }) @@ -42,7 +44,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout, navigationBar = View(context).apply { layoutParams = RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - manager.getNavigationBarHeight(context) + context.getNavigationBarHeight() ).apply { addRule(RelativeLayout.ALIGN_PARENT_BOTTOM) } } navigationBar.tag = tag.navigationBarViewTag() @@ -51,7 +53,7 @@ internal class RelativeLayoutCreator(private val relativeLayout: RelativeLayout, navigationBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { navigationBar.layoutParams = (navigationBar.layoutParams as RelativeLayout.LayoutParams) - .apply { bottomMargin = if (fitWindow) -manager.getNavigationBarHeight(context) else 0 } + .apply { bottomMargin = if (fitWindow) -context.getNavigationBarHeight() else 0 } navigationBar.viewTreeObserver.removeGlobalOnLayoutListener(this) } }) diff --git a/library/src/main/java/com/zackratos/ultimatebarx/library/view/ViewGroupCreator.kt b/library/src/main/java/com/zackratos/ultimatebarx/library/view/ViewGroupCreator.kt index 1e7d54b..6a540c3 100644 --- a/library/src/main/java/com/zackratos/ultimatebarx/library/view/ViewGroupCreator.kt +++ b/library/src/main/java/com/zackratos/ultimatebarx/library/view/ViewGroupCreator.kt @@ -4,6 +4,8 @@ import android.content.Context import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver +import com.zackratos.ultimatebarx.library.extension.getNavigationBarHeight +import com.zackratos.ultimatebarx.library.extension.getStatusBarHeight /** * @Author : Zackratos @@ -18,7 +20,7 @@ internal class ViewGroupCreator(private val viewGroup: ViewGroup?, tag: Tag): Ba if (statusBar == null) { statusBar = View(context) statusBar.tag = tag.statusBarViewTag() - viewGroup?.addView(statusBar, ViewGroup.LayoutParams.MATCH_PARENT, manager.getStatusBarHeight(context)) + viewGroup?.addView(statusBar, ViewGroup.LayoutParams.MATCH_PARENT, context.getStatusBarHeight()) } statusBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { @@ -43,7 +45,7 @@ internal class ViewGroupCreator(private val viewGroup: ViewGroup?, tag: Tag): Ba if (navigationBar == null) { navigationBar = View(context) navigationBar.tag = tag.navigationBarViewTag() - viewGroup?.addView(navigationBar, ViewGroup.LayoutParams.MATCH_PARENT, manager.getNavigationBarHeight(context)) + viewGroup?.addView(navigationBar, ViewGroup.LayoutParams.MATCH_PARENT, context.getNavigationBarHeight()) } navigationBar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() {