Android侧滑返回分析和实现(不高仿微信),kotlin开发android

//设置状态栏文字&图标暗色
systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
//去除状态栏背景
mDecorView.setSystemUiVisibility(systemUiVisibility);
//设置状态栏透明
mSwipeBackActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
mSwipeBackActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
mSwipeBackActivity.getWindow().setStatusBarColor(Color.TRANSPARENT);
}
//监听DecorView的布局变化
mDecorView.addOnLayoutChangeListener(mPrivateListener);
return true;
}

这里有几个要注意的地方。
I. SDK小于19是不支持状态栏透明的,SD21及以上的实现方式也有所不同。
II. SD23及以上支持状态栏颜色反转。
III. SD24及以上支持窗口模式,这里要进行判断,当窗口模式时,不要设置状态栏透明。
IV. 状态栏设置透明之后,输入法的adjustResize会失效。网传解决方案android:fitsSystemWindows="true"不推荐使用,因为这会导致无法在状态栏之下进行绘制。因此这里对DecorView布局变化进行监听,布局变化时动态调整子View的高度为DecorView的可见部分。贴一下代码:

public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//获取DecorView的可见区域
Rect visibleDisplayRect = new Rect();
mDecorView.getWindowVisibleDisplayFrame(visibleDisplayRect);
/*这里省略一小段代码,后文提及/
//状态栏透明情况下,输入法的adjustResize不会生效,这里手动调整View的高度以适配
if (isStatusBarTransparent()) {
for (int i = 0; i < mDecorView.getChildCount(); i++) {
View child = mDecorView.getChildAt(i);
if (child instanceof ViewGroup) {
//获取DecorView的子ViewGroup
ViewGroup.LayoutParams childLp = child.getLayoutParams();
//调整子ViewGroup的paddingBottom
int paddingBottom = bottom - visibleDisplayRect.bottom;
if (childLp instanceof ViewGroup.MarginLayoutParams) {
//此处减去bottomMargin,是考虑到导航栏的高度
paddingBottom -= ((ViewGroup.MarginLayoutParams) childLp).bottomMargin;
}
paddingBottom = Math.max(0, paddingBottom);
if (paddingBottom != child.getPaddingBottom()) {
//调整子ViewGroup的paddingBottom,以保证整个ViewGroup可见
child.setPadding(child.getPaddingLeft(), child.getPaddingTop(), child.getPaddingRight(), paddingBottom);
}
break;
}
}
}
}

这里同样有两个小点需要注意:一个是paddingBottom的计算一定要考虑到导航栏高度的计算。还有就是paddingBottom不能为负值。

  • Step.2 支持侧滑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值