手机信息
品牌:OPPO
型号:PEUM00
Android版本:11
ColorOS版本:V12
屏幕信息
完全展开时:
宽:1920
高:1572
像素比例:2.75
每寸像素:440
完全折叠时:
宽:988
高:1762
像素比例:2.75
每寸像素:440
目的一:实时掌握屏幕的折叠情况,最起码能拿到是叠起还是展开
参考文章1:https://zhuanlan.zhihu.com/p/455215266
参考文章2:https://blog.csdn.net/Vaccae/article/details/125383573
探索过程:
参考文章1使用的库:api "androidx.window:window:1.0.0-alpha09"
参考文章2使用的库:api "androidx.window:window:1.0.0"
按照文章的思路,两种方法最终都会获取如下对象:
val foldingFeature = layoutInfo.displayFeatures.filterIsInstance<FoldingFeature>().firstOrNull()
但是foldingFeature始终为空,通过打印layoutInfo.displayFeatures的结果看,
layoutInfo.displayFeatures里面的集合是空,因此想通过FoldingFeature来拿到屏幕状态就不能实现
但是,通过以下代码却可以在屏幕展开或者叠起后,实时拿到屏幕的宽高信息,注意:这个方法只在屏幕宽高变化后才会调用:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
Log.i("test111", "screenHeightDp:" + newConfig.screenHeightDp + ", screenWidthDp:" + newConfig.screenWidthDp);
}
因此我决定在这个方法中对页面中的某些控件进行操作,比如弹出的DrawerLayout、Dialog等,以DrawerLayout举例说明:
DrawerLayout在弹出状态下,对屏幕进行折叠和展开操作,DrawerLayout的宽度不会随之变化,因此可以在这个监听中根据屏幕宽度对DrawerLayout的宽度进行实时修改。
目的二:页面适配
1:我们APP中的页面使用的是dimen这种以360DP的屏幕宽度为基础等比放大的方法,当屏幕折叠起来的时候,使用dimen显示是正常的,但是当屏幕展开后,由于屏幕的宽度变大了,因此页面里面的布局也随之等比放大了,为此我们进行了讨论,最终决定将屏幕宽度的上限定为600DP,小于600DP还是按照dimen的方法进行等比放大,大于等于600DP的则使用正常的DP,而不再使用dimen
image.png image.png
2:app中尺寸使用标准
xml中,还是要使用dimen,而不是直接使用DP:
正确:
android:paddingHorizontal="@dimen/dp_12"
android:paddingVertical="@dimen/dp_5"
错误:
android:layout_height="30dp"
android:textSize="16sp"
代码中同XML:
正确:
SizeUtils.getDimenFloat(R.dimen.dp_12)
SizeUtils.getDimen(R.dimen.dp_12)
错误:
DisplayUtils.dp2px(context, 12)等
3:控件适配:比如drawlayout,当抽屉在打开的状态下,进行屏幕折叠,这时候会发现抽屉的宽高没变化(这里有个前提是:Activity没有重新走生命周期),因此这种情况下也需要适配
目的三:折叠和展开时页面不重新启动
在清单文件Activity的声明中加入以下配置:
android:configChanges="screenSize|orientation|smallestScreenSize|screenLayout"
网友评论