目录
- 问题是什么
- 解决方法?
- 原因是什么?
- 还有其他需要适配?
一、问题是什么?
我们先截图看看问题:
这是平板展示的效果,可以看到,内容太大了,可见范围太小,这是现在的问题。

这是手机的展示的效果,挺好的

我们想要平板也这样

二、解决方法
(1)activity
kotlin
abstract class BaseActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFrameActivity<VB, VM>(),CustomAdapt {
override fun isBaseOnWidth() = !PhoneUtils.isPad()
override fun getSizeInDp(): Float {
return if (!PhoneUtils.isPad()) 360f else 720f
}
}
(2)fragment
kotlin
abstract class BaseFragment<VB : ViewBinding, VM : BaseViewModel> : BaseFrameFragment<VB, VM>(),CustomAdapt{
override fun isBaseOnWidth() = !PhoneUtils.isPad()
override fun getSizeInDp(): Float {
return if (!PhoneUtils.isPad()) 360f else 720f
}
}
(3)application(可选)
kotlin
open class BaseApplication : MultiDexApplication() {
override fun onCreate() {
super.onCreate()
//屏幕适配
AutoSize.initCompatMultiProcess(this)
AutoSizeConfig.getInstance().setCustomFragment(true)
}
}
三、原理
但为什么360f在平板上ui变得很大呢?而在手机就正常呢?



3.1 CustomAdapt
android-autosize
是一个屏幕适配库,CustomAdapt
接口允许你为特定页面(Activity/Fragment)定制专属的屏幕适配方案,不同于全局设置。
1. isBaseOnWidth()
作用:
-
决定适配基准:告诉库使用宽度还是高度作为适配基准
-
返回
true
:以宽度为基准(常见于手机竖屏) -
返回
false
:以高度为基准(常见于平板横屏) -
如果是平板(
isPad()
)就返回false
(以高度为基准),否则返回true
(以宽度为基准)
2. getSizeInDp()
作用:
-
设置设计稿尺寸:告诉库你设计稿的基准尺寸
-
手机:使用 360dp(常见手机设计稿宽度)
-
平板:使用 720dp(常见平板设计稿高度)
-
为什么平板要用高度基准?
-
平板横屏特性:
-
宽度变化范围大(10寸到13寸差30%)
-
高度变化范围小(所有平板横屏高度≈手机竖屏高度)
-
核心约束 : 宽度是刚性约束 (内容不能超宽) | 高度是刚性约束 (分区比例不能崩) |
简单来说,其实根本原因在于 autosize
的底层算法,对于基准为宽度和高度的逻辑不同。
四、除了配置这些,还有其他需要适配?
第一点:在写一个宽度的时候,尽量使用0dp,然后设置weight,而不是写死宽度,不然就会很小。
第二点:一些列表,可以考虑在平板的时候排列三行,非平板默认两行,把空间给利用起来。
五、还有更加简单的方法
kotlin
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
AutoSizeConfig.getInstance().setBaseOnWidth(!PhoneUtils.isPad())
}
}
ini
<meta-data
android:name="design_width_in_dp"
android:value="360" />
<meta-data
android:name="design_height_in_dp"
android:value="720"/>
直接这样就行,统一设置。
可以理解为
kotlin
override fun getSizeInDp(): Float {
return if (!PhoneUtils.isPad()) 360f else 720f
}
getSizeInDp和meta-data是同样的内容,根据平板还是手机去取对应的值就可以。
好了,这篇文章就到这里,我们下篇文章见。