转换成dp,sp的结论"/>
android 关于px转换成dp,sp的结论
最近看了很多px转换dp,sp的贴子,看到了很多种方法
有通过安卓自带的工具类反向推导得出的工具类
public class UnitUtils {//转换dip为pxpublic static int dp2px(Context context, int dip) {float scale = context.getResources().getDisplayMetrics().density;return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));}//转换px为dippublic static int px2dp(Context context, int px) {float scale = context.getResources().getDisplayMetrics().density;return (int) (px / scale + 0.5f * (px >= 0 ? 1 : -1));}public static int sp2px(Context context, float spValue) {float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}public static int px2sp(Context context, float pxValue) {float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (pxValue / fontScale + 0.5f);}
}
也有通过UI设计图片的宽高像素和屏幕尺寸,结合公式计算出来的
等等等等。。。。。。
最后通过测量控件高度打印日志,发现这些方法都不准确
可以这样算:
1、找UI问出作图时的宽和高的像素
2、通过代码获取设备的密度、dpi和宽
DisplayMetrics metrics = this.getResources().getDisplayMetrics();float density = metrics.density; //屏幕密度int dpi = metrics.densityDpi; //屏幕dpiint widthPixels = metrics.widthPixels; //屏幕宽度
3、dp = (UI标的px / UI作图的宽度)* 设备的宽度 / 屏幕密度
举个例子: UI作图时是以1024*768为准做的图,我的设备是1920*1200的,屏幕密度是2.25,dpi是360
UI标注图里有个控件宽高都是100px,那么
100 / 768 * 1200 / 2.25 = 69.444
所以我就可以写69.444 dp
但是!!!
如果换个设备呢,换成2048*1536的,屏幕密度和dpi都换了,那69.444肯定就不合适了,改怎么办呢?不要急。。。
这就用到了最小屏幕宽度,最小屏幕宽度的单位是dp,那最小屏幕宽度怎么计算呢?
最小屏幕宽度 dp = 160 * 屏幕宽度 / dpi
还拿我上面那个例子来看,我的设备的最小屏幕宽度就是
160 * 1200 / 360 = 533.333 dp
所以我可以在res下面建个文件夹 values-sw533dp 或者 values-sw530dp,只要小于等于算出来的最小屏幕宽度就行,为什么要小于等于最小屏幕宽度呢?因为系统是从大到小。。。扫描吧。。如果建的文件夹是 values-sw550dp ,设备的只有553.333,达不到550,就会自动进入小一级的,如果已经是最小的了就会用系统默认的values文件夹内的内容
建好文件夹后在下面建个dimen.xml的文件,内容大致为
<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="px10_sp">9.856sp</dimen><dimen name="px11_sp">10.841sp</dimen><dimen name="px12_sp">11.827sp</dimen><dimen name="px13_sp">12.813sp</dimen><dimen name="px14_sp">13.798sp</dimen><dimen name="px15_sp">14.784sp</dimen>
</resources>
可以用我写好的方法:
int width = 1200;//ui作图的屏幕宽度DisplayMetrics metrics = this.getResources().getDisplayMetrics();float density = metrics.density; //设备密度int dpi = metrics.densityDpi; //设备dpiint widthPixels = metrics.widthPixels; //设备宽度StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");for (int px = 0; px <= 200; px += 2) {String dp = px * 1.0 * widthPixels / width / density + "";if (dp.indexOf(".") + 4 < dp.length()) {//保留3位小数dp = dp.substring(0, dp.indexOf(".") + 4);}stringBuilder.append("<dimen name=\"px").append(px + "").append("_dp\">").append(dp).append("dp</dimen>\n");}stringBuilder.append("</resources>");Log.e("tag", stringBuilder.toString());
打印出来结果是
<?xml version="1.0" encoding="utf-8"?><resources><dimen name="px0_dp">0.0dp</dimen><dimen name="px2_dp">0.888dp</dimen><dimen name="px4_dp">1.777dp</dimen><dimen name="px6_dp">2.666dp</dimen><dimen name="px8_dp">3.555dp</dimen><dimen name="px10_dp">4.444dp</dimen><dimen name="px12_dp">5.333dp</dimen><dimen name="px14_dp">6.222dp</dimen><dimen name="px16_dp">7.111dp</dimen><dimen name="px18_dp">8.0dp</dimen><dimen name="px20_dp">8.888dp</dimen><dimen name="px22_dp">9.777dp</dimen><dimen name="px24_dp">10.666dp</dimen><dimen name="px26_dp">11.555dp</dimen><dimen name="px28_dp">12.444dp</dimen><dimen name="px30_dp">13.333dp</dimen><dimen name="px32_dp">14.222dp</dimen><dimen name="px34_dp">15.111dp</dimen><dimen name="px36_dp">16.0dp</dimen><dimen name="px38_dp">16.888dp</dimen><dimen name="px40_dp">17.777dp</dimen><dimen name="px42_dp">18.666dp</dimen><dimen name="px44_dp">19.555dp</dimen><dimen name="px46_dp">20.444dp</dimen><dimen name="px48_dp">21.333dp</dimen><dimen name="px50_dp">22.222dp</dimen><dimen name="px52_dp">23.111dp</dimen><dimen name="px54_dp">24.0dp</dimen><dimen name="px56_dp">24.888dp</dimen><dimen name="px58_dp">25.777dp</dimen><dimen name="px60_dp">26.666dp</dimen><dimen name="px62_dp">27.555dp</dimen><dimen name="px64_dp">28.444dp</dimen><dimen name="px66_dp">29.333dp</dimen><dimen name="px68_dp">30.222dp</dimen><dimen name="px70_dp">31.111dp</dimen><dimen name="px72_dp">32.0dp</dimen><dimen name="px74_dp">32.888dp</dimen><dimen name="px76_dp">33.777dp</dimen><dimen name="px78_dp">34.666dp</dimen><dimen name="px80_dp">35.555dp</dimen><dimen name="px82_dp">36.444dp</dimen><dimen name="px84_dp">37.333dp</dimen><dimen name="px86_dp">38.222dp</dimen><dimen name="px88_dp">39.111dp</dimen><dimen name="px90_dp">40.0dp</dimen><dimen name="px92_dp">40.888dp</dimen><dimen name="px94_dp">41.777dp</dimen><dimen name="px96_dp">42.666dp</dimen><dimen name="px98_dp">43.555dp</dimen><dimen name="px100_dp">44.444dp</dimen><dimen name="px102_dp">45.333dp</dimen><dimen name="px104_dp">46.222dp</dimen><dimen name="px106_dp">47.111dp</dimen><dimen name="px108_dp">48.0dp</dimen><dimen name="px110_dp">48.888dp</dimen><dimen name="px112_dp">49.777dp</dimen><dimen name="px114_dp">50.666dp</dimen><dimen name="px116_dp">51.555dp</dimen><dimen name="px118_dp">52.444dp</dimen><dimen name="px120_dp">53.333dp</dimen><dimen name="px122_dp">54.222dp</dimen><dimen name="px124_dp">55.111dp</dimen><dimen name="px126_dp">56.0dp</dimen><dimen name="px128_dp">56.888dp</dimen><dimen name="px130_dp">57.777dp</dimen><dimen name="px132_dp">58.666dp</dimen><dimen name="px134_dp">59.555dp</dimen><dimen name="px136_dp">60.444dp</dimen><dimen name="px138_dp">61.333dp</dimen><dimen name="px140_dp">62.222dp</dimen><dimen name="px142_dp">63.111dp</dimen><dimen name="px144_dp">64.0dp</dimen><dimen name="px146_dp">64.888dp</dimen><dimen name="px148_dp">65.777dp</dimen><dimen name="px150_dp">66.666dp</dimen><dimen name="px152_dp">67.555dp</dimen><dimen name="px154_dp">68.444dp</dimen><dimen name="px156_dp">69.333dp</dimen><dimen name="px158_dp">70.222dp</dimen><dimen name="px160_dp">71.111dp</dimen><dimen name="px162_dp">72.0dp</dimen><dimen name="px164_dp">72.888dp</dimen><dimen name="px166_dp">73.777dp</dimen><dimen name="px168_dp">74.666dp</dimen><dimen name="px170_dp">75.555dp</dimen><dimen name="px172_dp">76.444dp</dimen><dimen name="px174_dp">77.333dp</dimen><dimen name="px176_dp">78.222dp</dimen><dimen name="px178_dp">79.111dp</dimen><dimen name="px180_dp">80.0dp</dimen><dimen name="px182_dp">80.888dp</dimen><dimen name="px184_dp">81.777dp</dimen><dimen name="px186_dp">82.666dp</dimen><dimen name="px188_dp">83.555dp</dimen><dimen name="px190_dp">84.444dp</dimen><dimen name="px192_dp">85.333dp</dimen><dimen name="px194_dp">86.222dp</dimen><dimen name="px196_dp">87.111dp</dimen><dimen name="px198_dp">88.0dp</dimen><dimen name="px200_dp">88.888dp</dimen></resources>
到这里解决了px转换为dp的问题了,px转换为sp和这个方法一样,只是把dp改为sp就行了
做不同屏幕的适配就需要知道那个屏幕的宽度、屏幕密度、屏幕dpi,然后套用这个方法就行了。
更多推荐
android 关于px转换成dp,sp的结论
发布评论