按比例适配安卓屏幕的方案(今日头条的适配方案)

一、概念理解

首先理解一些概念:
px:就是像素,比如手机分辨率 1920*1080 指得就是分辨率。
dpi:像素密度,也就是一英寸所占用的像素点。
density:个人理解是像素比。安卓规定 dpi 为160 的时候,px跟dp 就是1:1。而density的计算公式就是
density = dpi / 160。
dp:安卓定义的一个抽象的单位,实际并不存在,为了统一各个设备之间尺寸适配的问题而出现的。计算公式:dp = px / density 。

从上面的我们可以推断出:
设屏幕宽度为 w ,宽度上的分辨率为px ,那么
dpi = px/w
density = px/(w * 160)
dp = px / (px/(w * 160) ) = 160 * w

也就是说,一英寸里面,就是包含160dp 。感觉可以理解成dp 是一个物理上的单位。
安卓会自动的把我们的dp转换为对应设配的分辨率px。安卓就是靠这个让同一个view在各个屏幕看起来都一样大小。

附上一张资源文件夹对应的像素密度值的图:
在这里插入图片描述

二、如何适配

让view在不同屏幕上看起来一样大小,其实这也是有问题的,比如在小屏幕的手机里一排放了四个图标,看起来刚刚好,但是到了屏幕大点的手机里,就会显得间距被放大了。
所以就有了按比例适配的方案,就是使得view跟屏幕的比例始终保持一致。px 是屏幕的物理属性,我们无法修改,但是我们可以手动修改density 的值,让它计算出来的px 值变成我们想要的 px 值:
比如我们设计图的宽度是 360 dp ,那么我们开发的时候都是按照这个尺寸是画界面的,我们就要让手机也变得跟我们一样宽度都是 360 dp。
也就是说 density 新的值为: density = px / 360 。px就是手机的分辨率。

代码:

public class ScreenAdaptUtil {

    public void setCustomDensity(Activity activity, Application application) {
        DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
        float density = (float) displayMetrics.widthPixels / 360;
        float newDpi = density * 160;

        displayMetrics.density = density;
        displayMetrics.scaledDensity = density;
        displayMetrics.densityDpi = (int) newDpi;

        DisplayMetrics activityMetrics = activity.getResources().getDisplayMetrics();
        activityMetrics.density = density;
        activityMetrics.scaledDensity = density;
        activityMetrics.densityDpi = (int) newDpi;
    }
}

其中 360 就是设计图里面的宽度

activity中使用:

 ScreenAdaptUtil.setCustomDensity(this,application)

三、使用第三方框架

现在已经有了可以实现按百分比适配的框架了——AndroidAutoSize

github 源码地址

使用可是超简单

<!--私有依赖-->
implementation 'me.jessyan:autosize:1.2.1'

在manifest 里面(这里根据你们的设计图去写,比如设计图上是360dp * 640dp 就如下):

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

当然,要放在 application 标签里面。

四、预览设备的选择

我们开发的时候该怎么样根据设计图选择UI 预览设备的呢?
在这里插入图片描述
可以看到,其实设备还不少。
其实我们可以根据上面的公式来算。
比如我们定的设计图是 360dp * 640dp
我们选择的时候其实并不是根据分辨率去选的,而是根据屏幕的大小,分辨率只要比例跟我们这个dp的比例一致就行了。
首先我们算出 斜边的 长度 (勾股定理都会把):734.3 dp
上文也说过,1英寸就有160dp 。那么手机屏幕大小为: 734.3/160 = 4.589(英寸)。
所以我们就找最接近4.589 英寸的屏幕,并且 宽高比满足 360 :640
所以就到了上图勾选的设备。这样我们开发的时候,基本就是所见即所得了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值