安卓进阶(11)之UI适配解决方案

博客内容

有些UI设计师给到我们的设计图的宽的单位是px(比如1080*1920),有的给到我们的的单位是dp(比如360dp),我们没法保证设计师到底给出哪一种,而且,给到我们的设计图的尺寸,我们除了适配常规的尺寸,还得适配非常规的手机分辨率。那具体我们应该怎么去做适配呢?

看了几篇帖子,都是人家用过非常成熟的,适用场景比较多的方案了。我自己总结了下,分为两种解决方案,一种是单位以px为参照物,一种是单位以dp为参照物。

smallestWidth限定符适配

核心原理

以单位px为参照物,将值根据手机机型适配成不同的dp值。

说直白点,就是设计师给一套宽为多少px的设计图,我们开发人员算出根据不同的手机分辨率和dpi值,算出当前手机的px和dp的比例,让比例的值放到不同的values-sw…dp文件加的dimens.xml文件中,运行app时,系统会自动去读取最相近的比例的值。

具体实现请参考Android目前最稳定和高效的UI适配方案

今日头条适配方案

核心原理

以单位dp为参照物,将值根据手机机型适配成不同的px值。

说直白点,就是设计师给一套宽为多少dp的设计图,然后通过公式换算,去重新设置每个ActivitydensityscaleDensitydensityDpi

private static void  setCustomDensity(Activity activity, final Application application){

    final DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();

    if(sNoncompatDensity == 0){

        sNoncompatDensity = displayMetrics.density;
        sNoncompatScaledDensity = displayMetrics.scaledDensity;
        application.registerComponentCallbacks(new ComponentCallbacks() {
            @Override
            public void onConfigurationChanged(Configuration newConfig) {
                if(newConfig != null && newConfig.fontScale > 0){
                    sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                }
            }

            @Override
            public void onLowMemory() {

            }
        });
    }

    final float targetDensity = displayMetrics.widthPixels / 360;
    final float targetScaledDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
    final int targetDensityDpi = (int)(160 * targetDensity);

    final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
    activityDisplayMetrics.density = targetDensity;
    activityDisplayMetrics.scaledDensity = targetScaledDensity;
    activityDisplayMetrics.densityDpi = targetDensityDpi;
}

适用场景

头条的那套方案,是以单位为dp的量身定制的,设计师是以宽度为360dp设计的,需要给到的单位是dp,然后通过公式,将每个手机中的分辨率和dpi,以一定比例换算成360dp相对应的值;而如果设计师给到的单位是px,比如960px640px,这时候宽度是640px,头条的那套方案是没法用的,设计图中用的单位是px,而你在xml布局中用dp,这是不行的。而smallestWidth那套方案,是可行的,相当于在xml布局中的单位是一个变量,而这个变量,会根据每个手机,到不同的values-sw…dp中去获取相对应的dp值,比如在宽度为640的设计图上有一个1018的图,然后在我dpi为480的手机上,会去找values为360dp的dimens.xml,获取相应的dp单位值。

参考文章:
Android目前最稳定和高效的UI适配方案
一种极低成本的Android屏幕适配方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值