android 屏幕适配的问题
建立一个java项目,写入如下代码,运行,会在pathroot路径下生成一个layoutroot文件夹,layoutroot文件夹下就生成了对应分辨率的valuesXXXXXX文件夹,将生成的这些文件夹全部复制到android项目的res文件夹下,这样当运行到对应分辨率的设备上时,通常界面就能正常显示了:
public class LayoutXmlOne
{
private final static String pathroot= "C:\\Users\\Administrator\\Desktop\\layoutroot\\values-{0}x{1}\\";
private final static float dw = 320f;
private final static float dh = 480f;
private final static String WTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";
private final static String HTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n";
public static void main(String[] args)
{
makeString(320, 480);
makeString(480,800);
makeString(480, 854);
makeString(540, 960);
makeString(600, 1024);
makeString(720, 1184);
makeString(720, 1196);
makeString(720, 1280);
makeString(768, 1024);
makeString(800, 1280);
makeString(1080, 1812);
makeString(1080, 1920);
makeString(1440, 2560);
}
public static void makeString(int w, int h)
{
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
sb.append("<resources>");
float cellw = w / dw;
for (int i = 1; i < 320; i++)
{
sb.append(WTemplate.replace("{0}", i + "").replace("{1}",
change(cellw * i) + ""));
}
sb.append(WTemplate.replace("{0}", "320").replace("{1}", w + ""));
sb.append("</resources>");
StringBuffer sb2 = new StringBuffer();
sb2.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
sb2.append("<resources>");
float cellh = h / dh;
for (int i = 1; i < 480; i++)
{
sb2.append(HTemplate.replace("{0}", i + "").replace("{1}",
change(cellh * i) + ""));
}
sb2.append(HTemplate.replace("{0}", "480").replace("{1}", h + ""));
sb2.append("</resources>");
String path = rootPath.replace("{0}", h + "").replace("{1}", w + "");
File rootFile = new File(path);
if (!rootFile.exists())
{
rootFile.mkdirs();
}
File layxFile = new File(path + "lay_x.xml");
File layyFile = new File(path + "lay_y.xml");
try
{
PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
pw.print(sb.toString());
pw.close();
pw = new PrintWriter(new FileOutputStream(layyFile));
pw.print(sb2.toString());
pw.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
public static float change(float a)
{
int temp = (int) (a * 100);
return temp / 100f;
}
}
但是当运行的设备没有找到对应的分辨率文件夹时,使用的是哪个文件呢,使用的是默认生成的values文件夹下的lay_x.xml和lay_y.xml文件,与之前valuesXXXXXX文件夹下的文件不同的是单位,前者为px后者为dp,运行下面代码,将生成的两个文件复制到values文件夹下,就可以匹配其他没有生成对应分辨率的设备了;
public class LayoutXmlTwo
{
private final static String rootPath = "C:\\Users\\Administrator\\Desktop\\layoutroot\\other_values-{0}x{1}\\";
private final static float dw = 320f;
private final static float dh = 480f;
private final static String WTemplate = "<dimen name=\"x{0}\">{1}dp</dimen>\n";
private final static String HTemplate = "<dimen name=\"y{0}\">{1}dp</dimen>\n";
public static void main(String[] args)
{
makeString(320, 480);
}
public static void makeString(int w, int h)
{
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
sb.append("<resources>");
float cellw = w / dw;
for (int i = 1; i < 320; i++)
{
sb.append(WTemplate.replace("{0}", i + "").replace("{1}",
change(cellw * i) + ""));
}
sb.append(WTemplate.replace("{0}", "320").replace("{1}", w + ""));
sb.append("</resources>");
StringBuffer sb2 = new StringBuffer();
sb2.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
sb2.append("<resources>");
float cellh = h / dh;
for (int i = 1; i < 480; i++)
{
sb2.append(HTemplate.replace("{0}", i + "").replace("{1}",
change(cellh * i) + ""));
}
sb2.append(HTemplate.replace("{0}", "480").replace("{1}", h + ""));
sb2.append("</resources>");
String path = rootPath.replace("{0}", h + "").replace("{1}", w + "");
File rootFile = new File(path);
if (!rootFile.exists())
{
rootFile.mkdirs();
}
File layxFile = new File(path + "lay_x.xml");
File layyFile = new File(path + "lay_y.xml");
try
{
PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
pw.print(sb.toString());
pw.close();
pw = new PrintWriter(new FileOutputStream(layyFile));
pw.print(sb2.toString());
pw.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
public static float change(float a)
{
int temp = (int) (a * 100);
return temp / 100f;
}
}
之后最重要的就是使用了,比如我们之前定义了“layout_width=33dp”,现在写成“layout_width=@dimen/x33”即可;
文字资料和适配资料的链接,资料写的挺详细,视频讲的也挺清楚得;
文字资料:http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023
视频资料:http://www.imooc.com/learn/484