package com.jooxmusic.mideast.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
/**
* Android屏幕適配Dimens文件生成工具類
* 參考:http://blog.csdn.net/guozhaohui628/article/details/71870530
* http://blog.csdn.net/lmj623565791/article/details/45460089
*
* @author xxxx
*/
public class AndroidDimensUtil {
/**
* 基準寬度和高度(通常設置成UI圖的分辨率的高度和寬度)
*/
private static final int baseHeight = 2560;
private static final int baseWidth = 1440;
/**
* 生成Dimens文件的路徑(項目的res文件夾)
*/
private static String FILE_PATH;
private static final String WidthTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";
private static final String HeightTemplate = "<dimen name=\"px_{0}\">{1}px</dimen>\n";
public static void main(String[] args) {
// 獲取項目res文件的路徑
getResPath(new File("").getAbsolutePath());
AndroidDimensUtil.createDimens(480, 320);
AndroidDimensUtil.createDimens(800, 480);
AndroidDimensUtil.createDimens(800, 600);
AndroidDimensUtil.createDimens(854, 480);
AndroidDimensUtil.createDimens(854, 540);
AndroidDimensUtil.createDimens(960, 540);
AndroidDimensUtil.createDimens(960, 640);
AndroidDimensUtil.createDimens(1024, 600);
AndroidDimensUtil.createDimens(1024, 768);
AndroidDimensUtil.createDimens(1184, 720);
AndroidDimensUtil.createDimens(1196, 720);
AndroidDimensUtil.createDimens(1208, 720);
AndroidDimensUtil.createDimens(1280, 720);
AndroidDimensUtil.createDimens(1280, 768);
AndroidDimensUtil.createDimens(1280, 800);
AndroidDimensUtil.createDimens(1334, 750);
AndroidDimensUtil.createDimens(1440, 900);
AndroidDimensUtil.createDimens(1700, 1080);
AndroidDimensUtil.createDimens(1776, 1080);
AndroidDimensUtil.createDimens(1794, 1080);
AndroidDimensUtil.createDimens(1800, 1080);
AndroidDimensUtil.createDimens(1812, 1080);
AndroidDimensUtil.createDimens(1920, 1080);
AndroidDimensUtil.createDimens(1920, 1200);
AndroidDimensUtil.createDimens(2160, 1080);
AndroidDimensUtil.createDimens(2560, 1440);
AndroidDimensUtil.createDimens(2560, 1600);
// 添加以上分辨率都木有通用的,參考:http://blog.csdn.net/guozhaohui628/article/details/71870530
AndroidDimensUtil.createCommonDimens(2);
}
/**
* 生成相應分辨率的文件
*
* @param dimenHeight 要生成相應分辨率的高
* @param dimenWidth 要生成相應分辨率的寬
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
private static void createDimens(int dimenHeight, int dimenWidth) {
// 生成Height
StringBuilder sbForHeight = new StringBuilder();
// 生成頭
sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
// 計算倍數
float scaleHeight = dimenHeight * 1.0f / baseHeight;
// System.out.println("生成Height : " + dimenHeight + " , 基準Height : " + baseHeight + " , height比例 : " + scaleHeight);
for (int i = 1; i < baseHeight; i++) {
// 根據倍率(最終保留兩位小數)生成
sbForHeight.append(HeightTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(scaleHeight * i) + ""));
}
// 最后一個直接寫成相應的高,不用計算
sbForHeight.append(HeightTemplate.replace("{0}", baseHeight + "").replace("{1}", dimenHeight + ""));
sbForHeight.append("</resources>");
// 生成Width
StringBuilder sbForWidth = new StringBuilder();
sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
float scaleWidth = dimenWidth * 1.0f / baseWidth;
// System.out.println("生成Width : " + dimenWidth + " , 基準Width : " + baseWidth + " , width比例 : " + scaleWidth);
for (int i = 1; i < baseWidth; i++) {
sbForWidth.append(WidthTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(scaleWidth * i) + ""));
}
sbForWidth.append(WidthTemplate.replace("{0}", baseWidth + "").replace("{1}", dimenWidth + ""));
sbForWidth.append("</resources>");
// 生成文件
File dimenFile = new File(FILE_PATH + File.separator + "values-" + dimenHeight + "x" + dimenWidth);
dimenFile.mkdirs();
System.out.println("指定分辨率:" + dimenHeight + "x" + dimenWidth);
File lay_xFile = new File(dimenFile.getAbsolutePath(), "lay_x.xml");
File lay_yFile = new File(dimenFile.getAbsolutePath(), "lay_y.xml");
try {
PrintWriter printWriter = new PrintWriter(new FileOutputStream(lay_xFile));
printWriter.print(sbForWidth.toString());
printWriter.close();
printWriter = new PrintWriter(new FileOutputStream(lay_yFile));
printWriter.print(sbForHeight.toString());
printWriter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 生成適配未找到對應分辨率設備的通用dimen文件(直接放置在values中,單位為px)
*
* @param commonDensity 通用density的值
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
private static void createCommonDimens(int commonDensity) {
float commonScale = 1.0f / commonDensity;
// 生成Height
StringBuilder sbForHeight = new StringBuilder();
// 生成頭
sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
for (int i = 1; i < baseHeight + 1; i++) {
// 根據倍率(最終保留兩位小數)生成
sbForHeight.append(HeightTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(commonScale * i) + "").replace("px", "dp"));
}
sbForHeight.append("</resources>");
// 生成Width
StringBuilder sbForWidth = new StringBuilder();
sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
for (int i = 1; i < baseWidth + 1; i++) {
sbForWidth.append(WidthTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(commonScale * i) + "").replace("px", "dp"));
}
sbForWidth.append("</resources>");
// 生成文件
File dimenFile = new File(FILE_PATH + File.separator + "values");
dimenFile.mkdirs();
System.out.println("未指定的通用分辨率(values中)");
File lay_xFile = new File(dimenFile.getAbsolutePath(), "lay_x.xml");
File lay_yFile = new File(dimenFile.getAbsolutePath(), "lay_y.xml");
try {
PrintWriter printWriter = new PrintWriter(new FileOutputStream(lay_xFile));
printWriter.print(sbForWidth.toString());
printWriter.close();
printWriter = new PrintWriter(new FileOutputStream(lay_yFile));
printWriter.print(sbForHeight.toString());
printWriter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 保留兩位小數
*
* @param a 要保留的Float數值
* @return 保留后的數值
*/
private static float leftTwoDecimal(float a) {
return (int) (a * 100) / 100f;
}
/**
* 利用遞歸查詢res文件夾的絕對路徑并賦值
*
* @param filePath 文件路徑
*/
private static void getResPath(String filePath) {
for (File file : new File(filePath).listFiles()) {
if (file.isDirectory()) {
// 遞歸
//這里將列出所有的文件夾
if (file.getAbsolutePath().contains("src") && file.getAbsolutePath().contains("res")) {
System.out.println("res路徑:" + file.getAbsolutePath());
FILE_PATH = file.getAbsolutePath();
return;
}
getResPath(file.getAbsolutePath());
}
}
}
}
Android java - 屏幕適配Dimens文件生成工具類
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 基于今日頭條適配方案方案封裝的工具類 使用方法,直接在activity的onCreate的中:ScreenAdap...
- Maven項目中用了mybatis框架,因此自然的用到了代碼生成工具mybatis-generator-core-...
- 背景 服務器對上傳文件一般進行文件類型的嚴格限制,防止有惡意文件上傳至服務器。一般使用“后綴名”方式去鑒別上傳文件...
- 在開發中關于文件的操作是很常見的,為了以后方便先總結起來,方便自己也方便大家。同時也歡迎大家指正和補充。 1.得到...