Android 稳定和高效的UI适配方案

android适配最核心的问题有两个,其一,就是适配的效率,即把设计图转化为App界面的过程是否高效,其二如何保证实现UI界面在不同尺寸和分辨率的手机中UI的一致性。这两个问题都很重要,一个是保证我们开发的高效,一个是保证我们适配的成效

首先,大家都知道,在标识尺寸的时候,Android并不推荐我们使用px这个真实像素单位,因为不同的手机之间,分辨率是不同的,比如一个96*96像素的控件在分辨率越来越高的手机上会在整体UI中看起来越来越小

1

dp = dpi / 160 1dp = 2px 1dp = 3px
dp相当于手机屏幕上的点 为单位 一个点可能包含1px 2px 3px 但都是一个点的大小
通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。

这种方式存在两个小问题,第一,这只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,dp只解决了90%的适配问题
第二个问题,这种方式无法快速高效的把设计师的设计稿实现到布局代码中,设计稿的宽高是375px / 750px,而真实手机可能普遍是1080 /1920,
基本都是通过百分比啊,或者通过估算,或者设定一个规范值等等。总之,当我们拿到设计稿的时候,设计稿的ImageView是128px128px,当我们在编写layout文件的时候,却不能直接写成128dp128dp。在把设计稿向UI代码转换的过程中,我们需要耗费相当的精力去转换尺寸,这会极大的降低我们的生产力,拉低开发效率。

2

宽高限定符适配
就是穷举市面上所有的Android手机的宽高像素值:
设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件。

比如以480x320为基准分辨率

宽度为320,将任何分辨率的宽度整分为320份,取值为x1-x320
高度为480,将任何分辨率的高度整分为480份,取值为y1-y480

那么对于 800*480 的分辨率的dimens文件来说,
x1=(480/320)*1=1.5px

x2=(480/320)*2=3px

说白了就是 以480/320 为设计稿 单位是PX 其他布局文件从X1-XN 通过计算 是 320的1px的倍数关系
相当于每一个像素都等比例 缩放了 (480/320)
dimen文件中就只有X1-XN 没有具体的 “dimen name=“fab_margin”>16px</dimen”
value 中 分成了 320 分 一份就是1px 要求宽度是10px 就直接找X10
就是10px layout-width=“@dimen/x10”
不同屏幕下 会找对应的 value-800X480 下面的X10  实现等比例缩放

这样基本解决了我们的适配问题,而且极大的提升了我们UI开发的效率,

那就是需要精准命中才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差

在这里插入图片描述
在这里插入图片描述

小结

讨论的上述几种适配方案都是可以实际用于开发中的比较成熟的方案,而且确实有很多开发者正在使用。不过由于他们各自都存在一些缺陷,所以我们使用了上述方案后还需要花费额外的精力着手解决这些可能存在的缺陷。

那么,是否存在一种相对比较完美,没有明显的缺陷的方案呢?

3 smallestWidth适配

smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。

这种机制和上文提到的宽高限定符适配原理上是一样的,都是系统通过特定的规则来选择对应的文件。

小米5的dpi是480,横向像素是1080px,根据 px=dp(dpi/160),横向的dp值是1080/(480/160),也就是360dp,系统就会去寻找是否存在value-sw360dp的文件夹以及对应的资源文件。
480 / 160 = 3
也就是1dp = 3px 360dp = 1080px

在这里插入图片描述
smallestWidth限定符适配 有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。

320px = 320dp 要求10px 就是10dp=@dimen/x10

不同屏幕的10dp基本相同,所以大于320的 显示应该大于10dp的显示效果 相当于放大了才对

480下 就是 X10 = 15dp view被等比例放大了 reference 还是 @dimen/x10

根据固定的放缩比例,我们基本可以按照UI设计的尺寸不假思索的填写对应的dimens引用。

以375个像素宽度的设计稿为例 value-sw375dp 375px 375dp分别充满了各自的view 注意这里设计稿是px 所以要 1px = 1dp
将设计稿的px 1:1 转换为pd 做等价处理 相当于等比例缩放 3倍 或者2倍等等 但实际的 1dp = 3px 360dp = 1080px
375的手机 375dp = 375px 1:1
360的手机 根据设计稿不变原则(设计稿满屏)
375dp = 360dp(手机满屏360dp)
所以 该dp = 360 / 375 = 0.96
设计稿上出现了一个10px X 10px的ImageView
layout文件中 layout-width=“@dimen/x10”
9.6dp

在这里插入图片描述
当系统识别到手机的smallestWidth值时,就会自动去寻找和目标数据最近的资源文件的尺寸
smallestWidth的适配机制由系统保证,我们只需要针对这套规则生成对应的资源文件即可,不会出现什么难以解决的问题,也根本不会影响我们的业务逻辑代码,而且只要我们生成的资源文件分布合理,,即使对应的smallestWidth值没有找到完全对应的资源文件,它也能向下兼容,寻找最接近的资源文件

平板的布局文件(但是实际上显然用于diemns适配的效果更好)

多个dimens文件可能导致apk变大,这是事实,根据生成的dimens文件的覆盖范围和尺寸范围,apk可能会增大300kb-800kb左右
平板适配的问题
不要生成480以上的适配文件,这样在平板上,系统就会使用480这个尺寸的dimens文件
团队主动设计了平板的UI,那么我们就需要主动生成平板的适配文件,大概在600-800之间,关键尺寸是640,768 sw = 600dp 或 sw = 720dp。然后按照UI设计的图来写即可

smallestWidth 升级

我们会发现,其实每份设计稿常用的px值都是固定的十来个。例如同样以375px的设计稿为基准的话,使用工具会生成1px ~ 375px对应的dp值,所以会存在大量的无用dimens值。这样只会徒增安装包的大小。
使用calces.screen快速实现Smalles Widths适配方案
需要引入calces插件
gradle 地址 :plugins.gradle.org
在 工程 的build.gradle中添加代码:
//Gradle版本高于2.1的情况下(推荐方案)

plugins {
    id "calces.screen" version "1.3.4-alpha02"
}

//Gradle版本低于2.1的情况下(2.1以上版本也兼容这种方式)

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.tangpj.tools:screen:1.3.4-alpha02"
  }
}

使用calces.screen适配屏幕
首先,我们需要在res/values/文件夹中创建dimens.xml文件,然后按照设计稿的标尺把需要用到的尺寸写到该文件下。例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--design 375px-->
    <dimen name="px_48">48dp</dimen>
    <dimen name="px_75">75dp</dimen>
    <dimen name="px_100">100dp</dimen>
    <dimen name="px_125">125dp</dimen>
    <dimen name="px_150">150dp</dimen>
    <dimen name="px_200">200dp</dimen>
    <dimen name="px_250">250dp</dimen>
    <dimen name="px_300">300dp</dimen>
    <dimen name="px_375">375dp</dimen>

    <!--text size-->
    <dimen name="text_px_28">28sp</dimen>
    <dimen name="text_px_32">32sp</dimen>
    <dimen name="text_px_40">40sp</dimen>
</resources>

复制代码这就是我们的基准dimens文件。
现在我们只需要把基准尺寸与需要适配的尺寸通过Gradle配置就可以了,例如,上面的例子中,我们需要适配的sw有:320dp, 411dp, 900dp,那么我们需要在modules的build.gradle文件下添加如下代码:

复制代码在modules的build.gradle中添加代码:
apply plugin: ‘calces.screen’

 screen{
    dimens{
        designPx 375
        smallesWidths 320,360,375,411,480,750
        scale 3            //保留小数位,默认为2
        scaleMode BigDecimal.ROUND_HALF_UP  //小数保留的方式
        auto true
    }
     mipmap{
         designDensity "xxxhdpi" //测试用,目前手机屏幕最高只支持到xxhdpi
         mipmapDensity 'xxhdpi','xhdpi','mdpi','hdpi'
         auto true
     }
}

复制代码上面配置信息的对应关系是:

designPx:设计稿的sw尺寸(单位px)

smallesWidths:需要适配的屏幕sw尺寸(单位dp)

scale: 数字取整的方式
因为Android系统只能适配整数单位的dp值,所以我们可以通过scale来配置具体的取正方式。这里直接取BigDecimal提供的round来实现。如果不设置的话,则会生成double类型的dp值(实际使用的时候会丢弃小数位)

auto:是否自动生成dimens,当auto为true时,每次build都会重新生成一次适配dimens文件。
如果不设置auto或设置为false的话,可以手动调用gradle任务来生成。
调用命令: /gradlew dimensCovert
也可以直接点击gradle任务执行
如何确定我们需要适配什么sw值?
市面上有非常多设备的sw值都是360dp的,所以我们必须要适配360dp的设备。至于其它的设备,我们可以这样来确定,在开发者模式里面找到一项叫做最小宽度的参数,里面的值就是我们需要的sw值
推荐一个网站:Device Metrics
推荐的尺寸
单位 dp 300,320,360,411,450,这几个尺寸是比较必要的,然后在其中插入一些其他的尺寸即可,如果不放心,可以在300-450之间,以10为步长生成十几个文件。

除了提供自动实现基于sw方案的适配外,还提供了一个杀手级功能:根据配置自动把生成对应分辨率的位图资源。当我们需要适配多种不同屏幕密度的手机的时候,只需要提供一套高清位图资源就可以了,解放你和UI设计师的双手
密度限定 符比例关系 说明
ldpi 0.75 适用于低密度屏幕 (~120dpi) 的资源
mdpi 1 适用于中密度屏幕 (~160dpi) 的资源(基线密度)
hdpi 1. 5适用于高密度屏幕 (~240dpi) 的资源
xhdpi 2 适用于超高密度屏幕 (~320dpi) 的资源
xxhdpi 3 适用于超超高密度屏幕 (~480dpi) 的资源
xxxhdpi 4 适用于超超超高密度屏幕 (~640dpi) 的资源。此限定符仅适用于 启动器图标。
calces.screen管理位图
使用Screen的位图缩放功能之前,先和设计师/产品商量好App最高需要支持哪个密度的屏幕。然后设计师以后只需要提供这套密度的位图就可以了。之后我们只需要在modules的build.gradle中进行配置,配置方式如下:

screen{
    mipmap{
        designDensity "xxxhdpi" //测试用,目前手机屏幕最高只支持到xxxhdpi
        mipmapDensity 'xxhdpi','xhdpi','hdpi','mdpi'
        auto true
    }
}

配置完之后,重新build文件就可以了,当然不希望增加编译时间的话,可以把auto置为false或者不设置。mipmap支持增量编译功能,只会对文件夹中不存在的位图进行缩放,已存在则跳过,识别条件是文件名。
手动启动位图缩放功能的方式和上述方式一致,任务名称是mipmapZoom
可以大大减少UI设计师与工程师的工作量,只需要管理一套位图文件即可,把我们从机械化的任务中解放出来
目前版本不支持位图删除功能,所以当我们需要删除部分位图的时候,需要把自动生成的图片文件全部删除,重新生成

4 今日头条适配方案

VW布局 屏幕分为100份 以375为视口 100 X VW VW代表的值变化
今日头条 屏幕分为360份 360可看作视口 360dp X density density 变化
density = dpi / 160;
px = density * dp;
px = dp * (dpi / 160);

density = 3
1dp = 3px
360dp = 1080px

举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440
假设我们UI设计图是按屏幕宽度为360dp来设计的,那么在上述设备上,屏幕宽度其实为1080/(440/160)=392.7dp,也就是屏幕是比设计图要宽的。这种情况下, 即使使用dp也是无法在不同设备上显示为同样效果的。 同时还存在部分设备屏幕宽度不足360dp,这时就会导致按360dp宽度来开发实际显示不全的情况。

360dp * 3 = 1080PX 屏幕变大 density 变大 屏幕变小 density 变小 PX是相等的

dpi 小 density 小 导致 dp变大 360dp * 3 = 720dp * 1.5 PX是相等的

梳理需求
一般我们设计图都是以固定的尺寸来设计的。比如以分辨率1920px * 1080px来设计,以density为3来标注,也就是屏幕其实是640dp * 360dp。
因此,总结下大致需求如下:
支持以宽或者高一个维度去适配,保持该维度上和设计图一致;
支持dp和sp单位,控制迁移成本到最小。

找兼容突破口
从dp和px的转换公式 :px = dp * density
可以看出,如果设计图宽为360dp,想要保证在所有设备计算得出的px值都正好是屏幕宽度的话,我们只能修改 density 的值。
通过阅读源码,我们可以得知,density 是 DisplayMetrics 中的成员变量,而 DisplayMetrics 实例通过 Resources#getDisplayMetrics 可以获得,而Resouces通过Activity或者Application的Context获得。

先来熟悉下 DisplayMetrics 中和适配相关的几个变量:
DisplayMetrics#density 就是上述的density
DisplayMetrics#densityDpi 就是上述的dpi
DisplayMetrics#scaledDensity 字体的缩放因子,正常情况下和density相等,但是调节系统字体大小后会改变这个值

首先来看看布局文件中dp的转换,最终都是调用 TypedValue#applyDimension(int unit, float value, DisplayMetrics metrics) 来进行转换:
在这里插入图片描述

再看看图片的decode,BitmapFactory#decodeResourceStream方法:
这里用到的DisplayMetrics正是从Resources中获得的。
在这里插入图片描述
可见也是通过 DisplayMetrics 中的值来计算的

当然还有些其他dp转换的场景,基本都是通过 DisplayMetrics 来计算的,。因此,想要满足上述需求,我们只需要修改 DisplayMetrics 中和 dp 转换相关的变量即可。

最终方案

下面假设设计图宽度是360dp,以宽维度来适配。
1080px = 360dp X density
那么适配后的 density = 设备真实宽(单位px) / 360,接下来只需要把我们计算好的 density 在系统中修改下即可,代码实现如下:
真实的是 dpi除 160得到density 然后 屏幕PX 除以 density = dp dp是变化的 那些是出厂固定值
这样将dp固定 就能得到真实屏幕下变化的 density 和 dpi
在这里插入图片描述
小米手机 1080PX = 360dp X 3 density = 3 dpi = 480 = density X 160
代码第一步 获取 固定360dp 下的 计算得到的 density 和 dpi
第二部 将 dpi 和 density 赋值给系统的 对应属性 动态改变
同时在 Activity#onCreate 方法中调用下。代码比较简单,也没有涉及到系统非公开api的调用,因此理论上不会影响app稳定性。
但是收到了很多字体过小的反馈
DisplayMetrics#scaledDensity 字体的缩放因子,正常情况下和density相等,但是调节系统字体大小后会改变这个值
原因是在上面的适配中,我们忽略了DisplayMetrics#scaledDensity的特殊性,将DisplayMetrics#scaledDensity和DisplayMetrics#density设置为同样的值,从而某些用户在系统中修改了字体大小失效了,但是我们还不能直接用原始的scaledDensity,直接用的话可能导致某些文字超过显示区域,因此我们可以通过计算之前scaledDensity和density的比
就是之前用户改变scale后 与 density的 比例 X targetdensity 就是 安以前的比例动态变化 density
获得现在的scaledDensity,方式如下:
在这里插入图片描述
但是测试后发现另外一个问题,就是如果在系统设置中切换字体,再返回应用,字体并没有变化。于是还得监听下字体切换,调用 Application#registerComponentCallbacks 注册下 onConfigurationChanged 监听即可。

因此最终方案如下

在这里插入图片描述
当然以上代码只是以设计图宽360dp去适配的,如果要以高维度适配,可以再扩展下代码即可

缺点

比如 设计稿 375px 以375dp为准 测试机也是375dp 自己的ui合适 第三方也合适
运行到大屏后 比如400dp 自己的ui可以动态变大 density 所以比例不变
第三方 无法改变density 且没有 sw-400 第三方的ui相当于缩小了
小屏 同理 变大了

sw 一个求稳,今日头条 一个求快 决定以 375dp为设计稿

AndroidAutoSize

Step 1. 工程中

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

Step 2. module中

dependencies {
    implementation 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
}

Step 3. AndroidManifest.xml中

     <meta-data
            android:name="design_width_in_dp"
            android:value="375"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="640"/>
 </application>

框架就可以对项目中的所有页面进行适配

解决屏幕适配方案 时 横屏时 字体 图标放大的问题

  /**
   * 解决屏幕适配方案 时  横屏时 字体 图标放大的问题
   */
  override fun getResources(): Resources {
    val designWidth = AutoSizeConfig.getInstance().screenWidth
    val designHeight = AutoSizeConfig.getInstance().screenHeight
    val isBaseOnWidth = designWidth <= designHeight
    if(Looper.myLooper() == Looper.getMainLooper()){
      AutoSizeCompat.autoConvertDensity(super.getResources(),360.0F,isBaseOnWidth)
    }
    return super.getResources()
  }

当某个 Activity 想放弃适配,请实现 CancelAdapt 接口

public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {

}

当某个 Fragment 想放弃适配,请实现 CancelAdapt 接口

public class CancelAdaptFragment extends Fragment implements CancelAdapt {

}

是按照高度进行适配

// @return {@code true} 为按照宽度进行适配, {@code false} 为按照高度进行适配
// 此方案  是按照高度进行适配 暂时没有研高度的适配  暂不使用
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt {

    @Override
    public boolean isBaseOnWidth() {
        return false;
    }
//false   return  高度
    @Override
    public float getSizeInDp() {
        return 667;
    }
}

Fragment

 @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //由于某些原因, 屏幕旋转后 Fragment 的重建, 会导致框架对 Fragment 的自定义适配参数失去效果
        //所以如果您的 Fragment 允许屏幕旋转, 则请在 onCreateView 手动调用一次 AutoSize.autoConvertDensity()
        //如果您的 Fragment 不允许屏幕旋转, 则可以将下面调用 AutoSize.autoConvertDensity() 的代码删除掉
        AutoSize.autoConvertDensity(getActivity(), 1080, true);
        return createTextView(inflater, "Fragment-1\nView width = 360dp\nTotal width = 1080dp", 0xffff0000);
    }

BaseApplication

public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
        //在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this);

        //如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
        //可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
//        AutoSize.checkAndInit(this);

       /**
         * 以下是 AndroidAutoSize 可以自定义的参数, {@link AutoSizeConfig} 的每个方法的注释都写的很详细
         * 使用前请一定记得跳进源码,查看方法的注释, 下面的注释只是简单描述!!!
         */
        AutoSizeConfig.getInstance()
                 //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                //.setCustomFragment(true)
                //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
                //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
                //.setExcludeFontScale(true)

                //区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外,独自拥有全局调节 APP 字体大小的能力
                //当然, 在 APP 内您必须使用 sp 来作为字体的单位, 否则此功能无效, 不设置或将此值设为 0 则取消此功能
                //.setPrivateFontScale(0.8f)

                //屏幕适配监听器
                .setOnAdaptListener(new onAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
                        //使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
                        //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                        //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会主动重绘当前页面, 所以这时您需要自行重绘当前页面
                        //ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
//                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
//                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                        AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                    }
                })

                //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
               .setLog(false)

                //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
                //AutoSize 会将屏幕总高度减去状态栏高度来做适配
                //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
                //在全面屏或刘海屏幕设备中, 获取到的屏幕高度可能不包含状态栏高度, 所以在全面屏设备中不需要减去状态栏高度,所以可以 setUseDeviceSize(true)
//                .setUseDeviceSize(true)

                //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
//                .setBaseOnWidth(false)

                 //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
//                .setAutoAdaptStrategy(new AutoAdaptStrategy())
        ;
        customAdaptForExternal();
    }

    /**
     * 给外部的三方库 {@link Activity} 自定义适配参数, 因为三方库的 {@link Activity} 并不能通过实现
     * {@link CustomAdapt} 接口的方式来提供自定义适配参数 (因为远程依赖改不了源码)
     * 所以使用 {@link ExternalAdaptManager} 来替代实现接口的方式, 来提供自定义适配参数
     */
    private void customAdaptForExternal() {
        /**
         * {@link ExternalAdaptManager} 是一个管理外部三方库的适配信息和状态的管理类, 详细介绍请看 {@link ExternalAdaptManager} 的类注释
         */
        AutoSizeConfig.getInstance().getExternalAdaptManager()

                //加入的 Activity 将会放弃屏幕适配, 一般用于三方库的 Activity, 详情请看方法注释
                //如果不想放弃三方库页面的适配, 请用 addExternalAdaptInfoOfActivity 方法, 建议对三方库页面进行适配, 让自己的 App 更完美一点
//                .addCancelAdaptOfActivity(DefaultErrorActivity.class)

                //为指定的 Activity 提供自定义适配参数, AndroidAutoSize 将会按照提供的适配参数进行适配, 详情请看方法注释
                //一般用于三方库的 Activity, 因为三方库的设计图尺寸可能和项目自身的设计图尺寸不一致, 所以要想完美适配三方库的页面
                //就需要提供三方库的设计图尺寸, 以及适配的方向 (以宽为基准还是高为基准?)
                //三方库页面的设计图尺寸可能无法获知, 所以如果想让三方库的适配效果达到最好, 只有靠不断的尝试
                //由于 AndroidAutoSize 可以让布局在所有设备上都等比例缩放, 所以只要您在一个设备上测试出了一个最完美的设计图尺寸
                //那这个三方库页面在其他设备上也会呈现出同样的适配效果, 等比例缩放, 所以也就完成了三方库页面的屏幕适配
                //即使在不改三方库源码的情况下也可以完美适配三方库的页面, 这就是 AndroidAutoSize 的优势
                //但前提是三方库页面的布局使用的是 dp 和 sp, 如果布局全部使用的 px, 那 AndroidAutoSize 也将无能为力
                //经过测试 DefaultErrorActivity 的设计图宽度在 380dp - 400dp 显示效果都是比较舒服的
                .addExternalAdaptInfoOfActivity(DefaultErrorActivity.class, new ExternalAdaptInfo(true, 400));
    }
}
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值