开发android项目,需要进行多分辨率适配,能够支持国内主流的分辨率手机,总结一下,分为三个阶段:
一、一开始再做适配工作如果分辨率很接近就使用同一套xml布局文件,分辨率差距较大就会重新写一套,这样会很耗时间。
二、后来使用dimens文件,通过在xml中使用dimens文件确实可以帮助我们省去大多数时间。但是最近又遇到一个问题,就是有新的机型需要适配时,特别是提测的前期,需要根据dpi和密度计算出新分辨率下各种宽高值,如果你的项目很庞大,那么工作量也是不小的,最关键问题是手动计算很可能会出错,后来就自己写了一个小东西,根据标准分辨率自动生成新分辨率的dimens文件,省去很多事。
三、在这份代码中,以960X540分辨率为参照,生成800X480和854X480两种分辨率的dimens文件,具体代码如下:
public class DimenTool {
//参照分辨率dimens文件路径
public static final String dimensPath = "D:/workspace/res/values-hdpi/dimens.xml";
public static final String h800dimensPath = "D:/workspace/values-hdpi-800X480/dimens.xml";
public static final String h854dimensPath = "D:/workspace/values-hdpi-854X480/dimens.xml";
public static void main(String[] args) {
produceDimens();
}
public static void produceDimens() {
//以此文件夹下的dimens.xml文件内容为初始值参照
File file = new File(dimensPath);
BufferedReader reader = null;
// StringBuilder mdpi = new StringBuilder();
//hdpi-800x480
StringBuilder h800 = new StringBuilder();
//hdpi-854x480
StringBuilder h854 = new StringBuilder();
try {
reader = new BufferedReader(new FileReader(file));
String tempString;
int line = 1;
while ((tempString = reader.readLine()) != null) {
if (tempString.contains("</dimen>")) {
String start = tempString.substring(0, tempString.indexOf(">") + 1);
String end = tempString.substring(tempString.lastIndexOf("<") - 2);
//截取<dimen></dimen>标签内的内容,从>右括号开始,到左括号减2,取得配置的数字
Double num = Double.parseDouble
(tempString.substring(tempString.indexOf(">") + 1,
tempString.indexOf("</dimen>") - 2));
//此时区分vertical和horizontal,根据不同的尺寸计算新的值,拼接新的字符串,并且结尾处换行。
if(start.contains("vertical_dp")){
//mdpi.append(start).append(num / 1).append(end).append("\r\n");
h800.append(start).append((int)(num*5/6)).append(end).append("\r\n");
h854.append(start).append((int)(num*0.889)).append(end).append("\r\n");
}else if (start.contains("horizontal_dp")){
//mdpi.append(start).append(num / 1).append(end).append("\r\n");
h800.append(start).append((int)(num*8/9)).append(end).append("\r\n");
h854.append(start).append((int)(num*8/9)).append(end).append("\r\n");
}else{
h800.append(start).append(num).append(end).append("\r\n");
h854.append(start).append(num).append(end).append("\r\n");
}
} else {
// mdpi.append(tempString).append("");
h800.append(tempString).append("");
h854.append(tempString).append("");
}
line++;
}
reader.close();
System.out.println("<!-- h800 -->");
System.out.println(h800);
System.out.println("<!-- h854 -->");
System.out.println(h854);
String h800_file = h800dimensPath;
String h854_file = h854dimensPath;
writeFile(h800_file, h800.toString());
writeFile(h854_file, h854.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
/**
* 写入方法
*/
public static void writeFile(String file, String text) {
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
out.close();
}
一、一开始再做适配工作如果分辨率很接近就使用同一套xml布局文件,分辨率差距较大就会重新写一套,这样会很耗时间。
二、后来使用dimens文件,通过在xml中使用dimens文件确实可以帮助我们省去大多数时间。但是最近又遇到一个问题,就是有新的机型需要适配时,特别是提测的前期,需要根据dpi和密度计算出新分辨率下各种宽高值,如果你的项目很庞大,那么工作量也是不小的,最关键问题是手动计算很可能会出错,后来就自己写了一个小东西,根据标准分辨率自动生成新分辨率的dimens文件,省去很多事。
三、在这份代码中,以960X540分辨率为参照,生成800X480和854X480两种分辨率的dimens文件,具体代码如下:
public class DimenTool {
//参照分辨率dimens文件路径
public static final String dimensPath = "D:/workspace/res/values-hdpi/dimens.xml";
public static final String h800dimensPath = "D:/workspace/values-hdpi-800X480/dimens.xml";
public static final String h854dimensPath = "D:/workspace/values-hdpi-854X480/dimens.xml";
public static void main(String[] args) {
produceDimens();
}
public static void produceDimens() {
//以此文件夹下的dimens.xml文件内容为初始值参照
File file = new File(dimensPath);
BufferedReader reader = null;
// StringBuilder mdpi = new StringBuilder();
//hdpi-800x480
StringBuilder h800 = new StringBuilder();
//hdpi-854x480
StringBuilder h854 = new StringBuilder();
try {
reader = new BufferedReader(new FileReader(file));
String tempString;
int line = 1;
while ((tempString = reader.readLine()) != null) {
if (tempString.contains("</dimen>")) {
String start = tempString.substring(0, tempString.indexOf(">") + 1);
String end = tempString.substring(tempString.lastIndexOf("<") - 2);
//截取<dimen></dimen>标签内的内容,从>右括号开始,到左括号减2,取得配置的数字
Double num = Double.parseDouble
(tempString.substring(tempString.indexOf(">") + 1,
tempString.indexOf("</dimen>") - 2));
//此时区分vertical和horizontal,根据不同的尺寸计算新的值,拼接新的字符串,并且结尾处换行。
if(start.contains("vertical_dp")){
//mdpi.append(start).append(num / 1).append(end).append("\r\n");
h800.append(start).append((int)(num*5/6)).append(end).append("\r\n");
h854.append(start).append((int)(num*0.889)).append(end).append("\r\n");
}else if (start.contains("horizontal_dp")){
//mdpi.append(start).append(num / 1).append(end).append("\r\n");
h800.append(start).append((int)(num*8/9)).append(end).append("\r\n");
h854.append(start).append((int)(num*8/9)).append(end).append("\r\n");
}else{
h800.append(start).append(num).append(end).append("\r\n");
h854.append(start).append(num).append(end).append("\r\n");
}
} else {
// mdpi.append(tempString).append("");
h800.append(tempString).append("");
h854.append(tempString).append("");
}
line++;
}
reader.close();
System.out.println("<!-- h800 -->");
System.out.println(h800);
System.out.println("<!-- h854 -->");
System.out.println(h854);
String h800_file = h800dimensPath;
String h854_file = h854dimensPath;
writeFile(h800_file, h800.toString());
writeFile(h854_file, h854.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
/**
* 写入方法
*/
public static void writeFile(String file, String text) {
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
out.close();
}
希望多大家有帮助!