UI设计图一般是根据苹果6尺寸来标注的px值,由于做屏幕适配,我们需要将px转为dp
dp=px/density
density是设备密度
android系统自带有获取设备密度 context.getResources().getDisplayMetrics().density
虽有有了density,但是UI图中的px并非是按照你的android手机来标注的。
设备密度公式:density = PPI/160。
PPI是像素密度,公式:PPI = √(长度像素数² + 宽度像素数²) / 屏幕尺寸
通过以下方法,将 px与dp对应的转换输入到文件中.复制粘贴到dimens文件中就OK了
private void getDp() {
int width = 750;//屏幕宽度
int height = 1334;//屏幕高度
float screenInch = 4.7f;//屏幕尺寸
//设备密度公式
float density = (float) Math.sqrt(width * width + height * height) / screenInch / 160;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
for (int px = 0; px <= 1000; px += 2) {
//像素值除以density
String dp = px * 1.0f / 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>");
saveFile(stringBuilder.toString());
}
public static void saveFile(String str) {
String filePath = null;
boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (hasSDCard) { // SD卡根目录的px2dp.text
filePath = Environment.getExternalStorageDirectory().toString() + File.separator + "px2dp.txt";
} else // 系统下载缓存根目录的px2dp.text
filePath = Environment.getDownloadCacheDirectory().toString() + File.separator + "px2dp.txt";
try {
File file = new File(filePath);
if (!file.exists()) {
File dir = new File(file.getParent());
dir.mkdirs();
file.createNewFile();
}
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(str.getBytes());
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}