沉浸适配Android手势提示线
本文最后更新于 649 天前,其中的信息可能已经有所发展或是发生改变。

最近在做项目的时候,有朋友提出来要求适配一下手势线,但是在搜索引擎逛了一圈,都没发现合适的解决方案,于是自己稍微摸索了一下,虽然达到了效果,可能还有更好的方法,这里就简单记录一下。

首先来到themes.xml中,在你的主题里面加上下面这行

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

这一行生效的话,你的导航栏就变成透明的了,也就是说toolbar和navigationBar都将会在手机屏幕的最上端或最下端。

这样已经实现了让小白条沉浸,但是toolbar被状态栏覆盖了,所以接下来我们可以用padding或者margin来把toolbar调整到状态栏之下。

要获取状态栏或导航栏的高度,可以用如下两个方法

// 获取状态栏高度
public static int getStatusBarHeight(Activity activity) {
    @SuppressLint("InternalInsetResource")
    int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        return activity.getResources().getDimensionPixelOffset(resourceId);
    }
    return 0;
}

// 获取导航栏高度
public static int getNavigationBarHeight(Activity activity) {
    @SuppressLint("InternalInsetResource")
    int resourceId = activity.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
    if (resourceId > 0) {
        return activity.getResources().getDimensionPixelOffset(resourceId);
    }
    return 0;
}

然后再写一个通用的方法以便后续调用

public static Toolbar autoSetToolBarPaddingTop(Activity activity, Toolbar toolbar) {
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams();
    params.setMargins(params.leftMargin, getStatusBarHeight(activity), params.rightMargin, params.bottomMargin);
    toolbar.setLayoutParams(params);
    return toolbar;
}

这样,我们只需要在toolbar初始化之后调用,toolbar就自动调整位置了。

到这里,就已经实现了我们所需要的效果,但是还有一个小问题需要解决。

如果你的页面中含有BottomNavigation的话,如果用户的手机不支持小白条,而是传统的三键导航栏,对于BottomNavigation的显示可能会有一些小问题,如下所示。

要解决这个问题,还记得我们上面也顺带提到了获取导航条的高度么,接下来就需要用它来设置padding了。

public static void autoSetNavigationBarPaddingBottom(Activity activity, View view) {
    int height = getNavigationBarHeight(activity);
    ViewCompat.setOnApplyWindowInsetsListener(activity.getWindow().getDecorView(), (v, insets) -> {
        boolean isShowing = false;
        int naviHeight = 0;
        if (insets != null) {
            naviHeight = insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
            isShowing = Math.abs(naviHeight - height) <= 5;
        }
        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        view.setLayoutParams(params);
        if (isShowing) {
            params.height = activity.getResources().getDimensionPixelSize(R.dimen.bottom_nav_height) + getNavigationBarHeight(activity);
        }else {
            params.height = activity.getResources().getDimensionPixelSize(R.dimen.bottom_nav_height);
        }
        if (insets != null) {
            return ViewCompat.onApplyWindowInsets(v, insets);
        }
        return null;
    });
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
    params.height = params.height + getNavigationBarHeight(activity);
    view.setLayoutParams(params);
}

将代码中的R.dimen.bottom_nav_height改成你需要的高度即可,这个方法主要用于检测用户屏幕是否显示导航栏,以此来动态调整高度。

最后综合一下,来看看实际效果如何。

未经允许禁止转载本站内容,经允许转载后请严格遵守CC-BY-NC-ND知识共享协议4.0,代码部分则采用GPL v3.0协议
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇