目录

  1. 问题是什么
  2. 解决方法?
  3. 原因是什么?
  4. 还有其他需要适配?

一、问题是什么?

我们先截图看看问题:

这是平板展示的效果,可以看到,内容太大了,可见范围太小,这是现在的问题

图片.png

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

图片.png

我们想要平板也这样

图片.png


二、解决方法

(1)activity

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

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(可选)

open class BaseApplication : MultiDexApplication() {
override fun onCreate() {
    super.onCreate()
    //屏幕适配
    AutoSize.initCompatMultiProcess(this)
    AutoSizeConfig.getInstance().setCustomFragment(true)
    }
}

三、原理

但为什么360f在平板上ui变得很大呢?而在手机就正常呢?

b1ed403e5f4eff878887978e2545a6bd.jpg

4e1ce7b0cacc27a8ee35553a6e34d923.jpg

17825749499a67ffe118a462e09f95eb.jpg

3.1 CustomAdapt

android-autosize是一个屏幕适配库,CustomAdapt接口允许你为特定页面(Activity/Fragment)​​定制专属的屏幕适配方案​​,不同于全局设置。

1. isBaseOnWidth()作用:
  • ​决定适配基准​​:告诉库使用宽度还是高度作为适配基准

  • 返回 true:以​​宽度​​为基准(常见于手机竖屏)

  • 返回 false:以​​高度​​为基准(常见于平板横屏)

  • 如果是平板(isPad())就返回 false(以高度为基准),否则返回 true(以宽度为基准)

2. getSizeInDp()作用:
  • ​设置设计稿尺寸​​:告诉库你设计稿的基准尺寸

    • 手机:使用 360dp(常见手机设计稿宽度)

    • 平板:使用 720dp(常见平板设计稿高度)

为什么平板要用高度基准?
  1. ​平板横屏特性​​:

    • 宽度变化范围大(10寸到13寸差30%)

    • 高度变化范围小(所有平板横屏高度≈手机竖屏高度)

​核心约束​​ : 宽度是刚性约束 (内容不能超宽) | 高度是刚性约束 (分区比例不能崩) |

简单来说,其实根本原因在于 autosize的底层算法,对于基准为宽度和高度的逻辑不同。​


四、除了配置这些,还有其他需要适配?

第一点:在写一个宽度的时候,尽量使用0dp,然后设置weight,而不是写死宽度,不然就会很小。

第二点:一些列表,可以考虑在平板的时候排列三行,非平板默认两行,把空间给利用起来。


五、还有更加简单的方法

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        AutoSizeConfig.getInstance().setBaseOnWidth(!PhoneUtils.isPad())
    }
}
<meta-data
    android:name="design_width_in_dp"
    android:value="360" />

<meta-data
    android:name="design_height_in_dp"
    android:value="720"/>

直接这样就行,统一设置。

可以理解为

 override fun getSizeInDp(): Float {
     return if (!PhoneUtils.isPad()) 360f else 720f
 }

getSizeInDp和meta-data是同样的内容,根据平板还是手机去取对应的值就可以。

好了,这篇文章就到这里,我们下篇文章见。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]