smallestWidth 限定符适配 : 屏幕适配-插件:ScreenMatch

本文解析了为何smallestWidthDP在Android屏幕适配中的优势,对比了分辨率限定符的不足,并介绍了ScreenMatch插件如何通过smallestWidth进行自适应。讲解了如何获取设备信息,配置文件生成以及在实际开发中的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

Android 屏幕适配神器ScreenMatch

Android屏幕适配(一):ScreenMatch官方屏幕适配方案

Android屏幕适配全攻略(最权威的官方适配指导)

Carson带你学Android:屏幕适配-最全面的解决方案

切图应该放哪个 drawable 文件夹下

在这里插入图片描述

获取设备smallestWidthDP

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int heightPixels = dm.heightPixels;
int widthPixels = dm.widthPixels;
float density = dm.density;
float heightDP = heightPixels / density;
float widthDP = widthPixels / density;
float smallestWidthDP = Math.min(widthDP, heightDP);//411.42856

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);


        {
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            int heightPixels = dm.heightPixels;
            int widthPixels = dm.widthPixels;
            float density = dm.density;
            float densityDpi = dm.densityDpi;
            float heightDP = heightPixels / density;
            float widthDP = widthPixels / density;
            float smallestWidthDP = Math.min(widthDP, heightDP);//411.42856
            Log.e(TAG, "density====================" + density);
            Log.e(TAG, "heightDP====================" + heightDP);
            Log.e(TAG, "heightPixels====================" + heightPixels);
            Log.e(TAG, "densityDpi====================" + densityDpi);
            Log.e(TAG, "widthDP====================" + widthDP);
            Log.e(TAG, "widthPixels====================" + widthPixels);
            Log.e(TAG, "smallestWidthDP====================" + smallestWidthDP);
        }

        {
            DisplayMetrics displayMetrics = getApplication().getResources().getDisplayMetrics();
            float appDensity = displayMetrics.density;
            float appScaleDensity = displayMetrics.scaledDensity;
            float appDensityDpi = displayMetrics.densityDpi;
            float appHeightPixels = displayMetrics.heightPixels;
            float appWidthPixels = displayMetrics.widthPixels;
            Log.e(TAG, "appDensity====================" + appDensity);
            Log.e(TAG, "appScaleDensity====================" + appScaleDensity);
            Log.e(TAG, "appDensityDpi====================" + appDensityDpi);
            Log.e(TAG, "appHeightPixels====================" + appHeightPixels);
            Log.e(TAG, "appWidthPixels====================" + appWidthPixels);
        }

        {
            DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
            float activityDensity = displayMetrics.density;
            float activityScaleDensity = displayMetrics.scaledDensity;
            float activityDensityDpi = displayMetrics.densityDpi;
            float activityHeightPixels = displayMetrics.heightPixels;
            float activityWidthPixels = displayMetrics.widthPixels;
            Log.e(TAG, "activityDensity====================" + activityDensity);
            Log.e(TAG, "activityScaleDensity====================" + activityScaleDensity);
            Log.e(TAG, "activityDensityDpi====================" + activityDensityDpi);
            Log.e(TAG, "activityHeightPixels====================" + activityHeightPixels);
            Log.e(TAG, "activityWidthPixels====================" + activityWidthPixels);
        }

        Configuration configuration = getResources().getConfiguration();
        int smallestScreenWidthDp = configuration.smallestScreenWidthDp;
        int screenWidthDp = configuration.screenWidthDp;
        int screenHeightDp = configuration.screenHeightDp;
        int densityDpi2 = configuration.densityDpi;
        float density2 = getResources().getDisplayMetrics().density;
        Log.e(TAG, "screenWidthDp====================" + screenWidthDp);
        Log.e(TAG, "screenHeightDp====================" + screenHeightDp);
        Log.e(TAG, "densityDpi2====================" + densityDpi2);
        Log.e(TAG, "density2====================" + density2);
        Log.e(TAG, "smallestScreenWidthDp=============================" + smallestScreenWidthDp);
        // ========================================>分屏
        // density====================1.5
        // heightDP====================660.0
        // heightPixels====================990
        // densityDpi====================240.0
        // widthDP====================1280.0
        // widthPixels====================1920
        // smallestWidthDP====================660.0
        // screenWidthDp====================1280
        // screenHeightDp====================604
        // densityDpi2====================240
        // density2====================1.5
        // smallestScreenWidthDp=============================720
        // ========================================>全屏
        // density====================1.5
        // heightDP====================660.0
        // heightPixels====================990
        // densityDpi====================240.0
        // widthDP====================635.3333
        // widthPixels====================953
        // smallestWidthDP====================635.3333
        // screenWidthDp====================635
        // screenHeightDp====================604
        // densityDpi2====================288
        // density2====================1.8000001
        // smallestScreenWidthDp=============================635
    }

为什么选择 smallestWidth 限定符适配而不用屏幕分辨率限定符适配

  • 屏幕分辨率限定符适配根据屏幕分辨率的,Android 设备分辨率一大堆,而且还要考虑虚拟键盘,这样就需要大量的 dimens.xml 文件。因为无论手机屏幕的像素多少,密度多少,90% 的手机的最小宽度都为 360dp,所以采用 smallestWidth 限定符适配只需要少量 dimens.xml 文件即可。

  • 屏幕分辨率限定符适配采用的是 px 单位,而 smallestWidth 限定符适配采用的单位是 dp sp,dp 和 sp 是 google 推荐使用的计量单位。又由于很多应用要求字体大小随系统改变,所以字体单位使用 sp 也更灵活。

  • 屏幕分辨率限定符适配需要设备分辨率与 values-xx 文件夹完全匹配才能达到适配,而 smallestWidth 限定符适配寻找 dimens.xml 文件的原理是从大往小找,例如设备的最小宽度为 360dp,就会先去找 values-360dp,发现没有则会向下找 values-320dp,如果还是没有才找默认的 values 下的 demens.xml 文件,所以即使没有完全匹配也能达到不错的适配效果。

插件:ScreenMatch的使用:

ScreenMatch : 一种非常好用的Android屏幕适配

ScreenMatch : 一种非常好用的 Android 屏幕适配——smallestWidth 限定符适配

ScreenMatch 使用

  • 获取设计图最小宽度(单位为 dp)。
  • 以设计图最小宽度作为基准值,生成所有设备对应的 dimens.xml 文件。

如果项目只需要适配手机的话,只需要生成 320、360、362.2641、384、392.7272、400、410、411.4285、432、480 对应的 dimens.xml 文件即可。

  • 根据设计图标注,标注多少 dp,布局中就写多少 dp,格式为 @dimen/dp_XX。

1、下载插件

在这里插入图片描述

2、找到下载的插件

在这里插入图片描述

3、点击使用:

在这里插入图片描述

在这里插入图片描述

4、成功后:

在这里插入图片描述
配置生成文件如下:360dp为设计图的尺寸

在这里插入图片描述

5、布局中:

针对设计图,多少就是多少dp/sp
最小宽度该填多少,一般根据ui出的图来填写dp值,一般宽度显示多少 dp 就写多少 dp, 多少 sp 就写多少 sp。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值