Android开发中屏幕的适配问题 px pd sp之间的转换工具

在Android开发中,由于美工提供的像素(px)单位无法直接用于适配不同屏幕,需要转换为dp或sp。本文介绍了PPI的概念及dp, sp与px的换算公式,并分享了一个C++编写的转换工具源码,方便开发者进行屏幕适配工作。" 138737646,13310383,人工智能重塑网络攻防:美国视角(上),"['人工智能', '网络安全', 'web安全', '安全', '政策']

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

在Android开发中,美工妹子给我的图片都是px的单位,但是这个但是这个单位在程序中并不好,不能够自动适配。所以需要我们手动转换为dp。

关于DP,PD,SP

PPI = Pixels per inch,每英寸上的像素数,即 “像素密度”

ppi的运算方式是:
PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数

dp:Density-independent pixels,以160PPI屏幕为标准,则1dp=1px,

dp和px的换算公式 :
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。

sp:Scale-independent pixels,它是安卓的字体单位,以160PPI屏幕为标准,当字体大小为 100%时, 1sp=1px。

sp 与 px 的换算公式:sp*ppi/160 = px

得出:

px = dp*ppi/160
dp = px / (ppi / 160)

px = sp*ppi/160
sp = px / (ppi / 160)

dp ≈ sp

程序

所以我就需要按计算机计算咯。但是我怎么可能手动呢,于是我就写了一个C艹的可以执行文件。帮助计算。都是些垃圾代码。不敢私藏,拿出来分享,有需要改进的就随便改。(改了给我说说,一起用)

#include<stdlib.h>
#include<iostream>

using namespace std;

void PX_PD(float b) {
    while (true)
    {
        float a;
        cout << "请输入px:";
        cin >> a;
        cout << "dp =  " << a / b << endl;
    }

}

void PD_PX(float b) {
    while (true)
    {
        float a;
        cout << "请输入pd:";
        cin >> a;
        cout << "dx =  " << a * b << endl;
    }

}

int main() {
    cout << "------------------------------------------------------------------------------------------------------------" << endl;
    cout << "author:sorgs.如有需要改进的地方欢迎提出QQ:1042746391" << endl << " 由于开发Android程序员,美工妹子给的图片的单位和程序单位不一致,所以产生需要转换。(所有数据基于标准)" << endl;
    cout << "dp是虚拟像素,在不同的像素密度的设备上会自动适配,这里就采用标准的就OK。(sp和dp基本一样)" << endl;
    cout << "在mdpi分辨率,像素密度为160,1dp=1px" << endl;
    cout << "在hdpi分辨率,像素密度为240,1dp=1.5px" << endl;
    cout << "在xhdpi分辨率,像素密度为320,1dp=2px" << endl;
    cout << "在xxhdpi分辨率,像素密度为480,1dp=3px" << endl;
    cout << "计算公式:1dp*像素密度/160 = 实际像素数" << endl;
    cout << "------------------------------------------------------------------------------------------------------------" << endl;


number3:
    cout << "请输入需要转化的形式:1(px->dp) 2(dp->px)" << endl;
    int i;
    cin >> i;
    if (i == 1) {
    number1:
        cout << "请输入需要计算的分辨率: 1(mdpi) 2(hdpi) 3(xhdpi) 4(xxhdpi)" << endl;
        int j;
        cin >> j;
        if (j == 1) {
            PX_PD(1);
        }
        if (j == 2) {
            PX_PD(1.5);
        }
        if (j == 3) {
            PX_PD(2);
        }
        if (j == 4) {
            PX_PD(3);
        }
        else {
            cout << "貌似输入有误呢" << endl;
            goto number1;
        }

    }if (i == 2) {
    number2:
        cout << "请输入需要计算的分辨率: 1(mdpi) 2(hdpi) 3(xhdpi) 4(xxhdpi)" << endl;
        int j;
        cin >> j;
        if (j == 1) {
            PX_PD(1);
        }
        if (j == 2) {
            PX_PD(1.5);
        }
        if (j == 3) {
            PX_PD(2);
        }
        if (j == 4) {
            PX_PD(3);
        }
        else {
            cout << "貌似输入有误呢" << endl;
            goto number2;

        }
    }
    else {
        cout << "输入有误哦!" << endl;
        goto number3;
    }

}

最后放上源码地址:https://github.com/sorgs/DP_PX.git

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值