当前位置: 首页 > news >正文

Kotlin实现全屏显示效果,挖空和刘海屏适配

为了实现全屏效果,不是黑边就是状态栏和内容视图重叠,这个真的头大,网上好不容易找到一篇文章,解决就是挖孔屏和刘海屏还是不同的实现方案,我真的要笑,没办法,学习吧

测试机:
Android 11 的 Xiaomi MI MAX 3
Android 12 的 Xiaomi K40 Pro

1. 该方法在api30后提示已经过时 在onCreat()方法中,setContentView()前使用。
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN
)

测试结果:Android11和Android12均有效,但Android12的挖孔屏区域无效

2. 沉浸模式,查询到:Android系统到了4.4以后才提供沉浸式体验的支持。当设置透明效果后,4.4以下无效果,4.4~5.0全透明,5.0以上半透明;Android沉浸式模式的本质就是全屏化。
	//该方法是从官网复制过来的,效果不如意private fun hideSystemBars() {val windowInsetsController =ViewCompat.getWindowInsetsController(window.decorView) ?: return// Configure the behavior of the hidden system barswindowInsetsController.systemBarsBehavior =WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE// Hide both the status bar and the navigation barwindowInsetsController.hide(WindowInsetsCompat.Type.systemBars())}

测试结果:Android11无效,Android12有效,Android12的挖孔屏区域无效。Android11获取windowInsetsController为null

	//这是从别人那里拷过来的(csdn):https://blog.csdn.net/qq_32664007/article/details/126279919private fun hideSystemBars(window: Window) {//隐藏状态栏和导航栏 以及交互WindowInsetsControllerCompat(window, window.decorView).let {//隐藏状态栏和导航栏it.hide(WindowInsetsCompat.Type.systemBars())//交互效果it.systemBarsBehavior =WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE}}

测试结果:Android11无效,Android12有效,Android12的挖孔屏区域无效。

3.该方法在ide里提示已过时,在官网上未提示
val decorView = window.decorView
decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLEor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENor View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_FULLSCREENor View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)

测试结果:Android11和Android12均有效,但Android12的挖孔屏区域无效

4.该方法对测试机均有部分效过
WindowCompat.setDecorFitsSystemWindows(window, false)

测试结果:Android11和Android12的activity绘制区域均将状态栏的区域绘制成功,但状态栏依然透明显示,Android12的挖孔屏区域无效,效果如图(按钮绘制在状态栏的位置上):

5.使用主题
<item name="android:windowFullscreen">true</item>

测试结果:Android11有效,Android12有效,Android12的挖孔屏区域无效。

6.挖孔屏处理方式
//允许window 的内容可以上移到刘海屏状态栏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {val lp = window.attributeslp.layoutInDisplayCutoutMode =WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESwindow.attributes = lp
}

测试结果:Android12 挖孔屏有效

封装成工具类:

/*** 沉浸模式(全屏模式)* 设置全屏的方法* 参数window在activity或AppCompatActivity都带有*/
fun immersionFull(window: Window) {hideSystemBars(window)useSpecialScreen(window)
}
/*** 隐藏状态栏,显示内容上移到状态栏*/
private fun hideSystemBars(window: Window) {//占满全屏,activity绘制将状态栏也加入绘制范围。//如此即使使用BEHAVIOR_SHOW_BARS_BY_SWIPE或BEHAVIOR_SHOW_BARS_BY_TOUCH//也不会因为状态栏的显示而导致activity的绘制区域出现变形//使用刘海屏也需要这一句进行全屏处理WindowCompat.setDecorFitsSystemWindows(window, false)//隐藏状态栏和导航栏 以及交互WindowInsetsControllerCompat(window, window.decorView).let {//隐藏状态栏和导航栏//用于WindowInsetsCompat.Type.systemBars()隐藏两个系统栏//用于WindowInsetsCompat.Type.statusBars()仅隐藏状态栏//用于WindowInsetsCompat.Type.navigationBars()仅隐藏导航栏it.hide(WindowInsetsCompat.Type.systemBars())//交互效果//BEHAVIOR_SHOW_BARS_BY_SWIPE 下拉状态栏操作可能会导致activity画面变形//BEHAVIOR_SHOW_BARS_BY_TOUCH 未测试到与BEHAVIOR_SHOW_BARS_BY_SWIPE的明显差异//BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 下拉或上拉的屏幕交互操作会显示状态栏和导航栏it.systemBarsBehavior =WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE}
}
/*** 扩展使用刘海屏*/
private fun useSpecialScreen(window: Window) {//允许window 的内容可以上移到刘海屏状态栏if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {val lp = window.attributeslp.layoutInDisplayCutoutMode =WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESwindow.attributes = lp}
}

然后资源目录的主题文件里添加(res->values->themes.xml):

<!-- 导航栏透明 -->
<item name="android:navigationBarColor">@android:color/transparent
</item>
<!-- 状态栏透明 -->
<item name="android:statusBarColor">@android:color/transparent
</item>
<!-- 不要标题栏 -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

最后的效果就是:

对于手机底部区域全屏:

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

http://www.dtcms.com/a/590044.html

相关文章:

  • 什么网站可以做护考题网址搜索器
  • 网站快照长期不更新怎样注册自己的网址
  • 哪些网站是用c语言做的wordpress主题基础
  • 建设网站首页应该采用浙江省建设厅执业资格注册中心网站
  • 【JAVA 进阶】SpringBoot框架核心原理与高级特性深度解析
  • 小游戏网站欣赏山东网站设计公司
  • 计算机网络自顶向下方法43——网络层 详解SDN控制平面
  • 数据结构——三十九、顺序查找(王道408)
  • 自己做电影资源网站wordpress升级php版本
  • 创建型设计模式2
  • Flutter与鸿蒙EventChannel事件流通信详解
  • 销售型网站设计如何自助建站
  • 11月9日星期天今日早报简报微语报早读
  • 在cmd通过代理安装包(from deepseek)
  • 新网站怎么做外链做外贸网站需要什么卡
  • 江阴企业网站建设哪家好wordpress数据库用户角色
  • 表格识别技术,通过目标检测、结构分析和文字识别三步骤,实现对纸质档案表格的智能解析
  • 一级站点和二级站点区别免费网站建设创意
  • 网站怎么做才可以做评价网站 展示板
  • 新手学做网站优化如何知道网站是否被k
  • 408超难页表大题精析(201320202024)
  • xcpc退役随笔
  • 从缓冲区到Stream:数据流机制与应用
  • 赣州有没有做网站的怎么做企业网站一级悬浮菜单
  • 通信协议简谈
  • Vue 3 :详解setup 函数
  • OV5645 MIPI CSI-2 2-Lane配置分析:驱动与设备树的真实关系
  • 怎样注册网站卖东西发布html wordpress
  • template关键字
  • GradNorm