android多屏适配
来源:互联网 发布:淘宝扫码领红包怎么扫 编辑:程序博客网 时间:2024/05/22 04:37
现在通用的多屏适配有如下三种
1.match_parent2.weight3.多个文件夹(small,normal,large,and extra large),然后分别给出(计算)控件大小
第一个和第二个比较好理解,但是应用范围比较窄.比如我需要一个长宽均为屏幕一半的button并且要在屏幕正中间.用match_parent肯定不行,用weight可以倒是可以,但是不觉得还要多用好几个控件把空白地方撑满不方便吗?这只是个demo,如果在项目中呢?那么就只能采用第三种
参考文章:
http://blog.csdn.net/lmj623565791/article/details/45460089
http://www.cnblogs.com/soaringEveryday/p/4835839.html
接下来我就讲讲具体怎么做
1.计算屏幕的宽和高
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; // 得到宽度 int height = dm.heightPixels; // 得到高度 Log.e("DisplayMetrics", height + "*" + width);
2.用GenerateValueFiles.java(Java工程)生成对应的values文件夹
这个文件我是从参考文章中拿下来并且修改过的.为了区分横屏还是竖屏,我把竖屏的文件夹名字添加了land标记
输入一次w和h
输出两个文件夹values-h*w(竖屏专用)和values-land-w*h(横屏),每次只要选一个就行
3.把values文件夹copy进android工程
接下来我用虚拟机演示一下
(1)横屏
数据显示w=2560,h=1504
GenerateValueFiles文件的main函数指明了参数的规则
所以
private static final String SUPPORT_DIMESION = "2560,1504;";
生成的文件夹如下
由于这是横屏,所以只需要values-land-2560x1504这个文件夹
(2)竖屏
ctrl+F11切换竖屏
GenerateValueFiles文件里面
private static final String SUPPORT_DIMESION = "2560,1504;1600,2464;";
生成的文件夹
这次我只需要黑色的文件夹
(3)展示
android工程的文件夹res目录如下,就是多了两个对应的文件夹
布局文件如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="com.example.multiscreen.MainActivity" > <Button android:layout_width="@dimen/x160" android:layout_height="@dimen/y240" android:gravity="center" android:text="Button" /></RelativeLayout>
参考文章里说的很清楚,把宽度分成320分,那么160份就是整个屏幕的一半
运行看效果
忘了把GenerateValueFiles.java代码贴出来
public class GenerateValueFiles { private int baseW; private int baseH; private String dirStr = "./res"; 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"; /** * {0}-HEIGHT */ private final static String POTARIT_VALUE_TEMPLATE = "values-{0}x{1}"; /** * {0}-WIDTH */ private final static String LAND_VALUE_TEMPLATE = "values-land-{0}x{1}"; private static final String SUPPORT_DIMESION = "2560,1504;1600,2464;"; private String supportStr = SUPPORT_DIMESION; public GenerateValueFiles(int baseX, int baseY, String supportStr) { this.baseW = baseX; this.baseH = baseY; if (!this.supportStr.contains(baseX + "," + baseY)) { this.supportStr += baseX + "," + baseY + ";"; } this.supportStr += validateInput(supportStr); System.out.println(supportStr); File dir = new File(dirStr); if (!dir.exists()) { dir.mkdir(); } System.out.println(dir.getAbsoluteFile()); } /** * @param supportStr * w,h_...w,h; * @return */ private String validateInput(String supportStr) { StringBuffer sb = new StringBuffer(); String[] vals = supportStr.split("_"); int w = -1; int h = -1; String[] wh; for (String val : vals) { try { if (val == null || val.trim().length() == 0) continue; wh = val.split(","); w = Integer.parseInt(wh[0]); h = Integer.parseInt(wh[1]); } catch (Exception e) { System.out.println("skip invalidate params : w,h = " + val); continue; } sb.append(w + "," + h + ";"); } return sb.toString(); } public void generate() { String[] vals = supportStr.split(";"); for (String val : vals) { String[] wh = val.split(","); generatePotraitXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1])); generateLandXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1])); } } /** * 竖屏 */ private void generatePotraitXmlFile(int w, int h) { StringBuffer sbForWidth = new StringBuffer(); sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); sbForWidth.append("<resources>"); float cellw = w * 1.0f / baseW; System.out.println("width : " + w + "," + baseW + "," + cellw); for (int i = 1; i < baseW; i++) { sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}", change(cellw * i) + "")); } sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}", w + "")); sbForWidth.append("</resources>"); StringBuffer sbForHeight = new StringBuffer(); sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); sbForHeight.append("<resources>"); float cellh = h * 1.0f / baseH; System.out.println("height : " + h + "," + baseH + "," + cellh); for (int i = 1; i < baseH; i++) { sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}", change(cellh * i) + "")); } sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}", h + "")); sbForHeight.append("</resources>"); File fileDir = new File(dirStr + File.separator + POTARIT_VALUE_TEMPLATE.replace("{0}", h + "")// .replace("{1}", w + "")); fileDir.mkdir(); File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml"); File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml"); try { PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile)); pw.print(sbForWidth.toString()); pw.close(); pw = new PrintWriter(new FileOutputStream(layyFile)); pw.print(sbForHeight.toString()); pw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } /** * 横屏 */ private void generateLandXmlFile(int w, int h) { StringBuffer sbForWidth = new StringBuffer(); sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); sbForWidth.append("<resources>"); float cellw = w * 1.0f / baseW; System.out.println("width : " + w + "," + baseW + "," + cellw); for (int i = 1; i < baseW; i++) { sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}", change(cellw * i) + "")); } sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}", w + "")); sbForWidth.append("</resources>"); StringBuffer sbForHeight = new StringBuffer(); sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); sbForHeight.append("<resources>"); float cellh = h * 1.0f / baseH; System.out.println("height : " + h + "," + baseH + "," + cellh); for (int i = 1; i < baseH; i++) { sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}", change(cellh * i) + "")); } sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}", h + "")); sbForHeight.append("</resources>"); File fileDir = new File(dirStr + File.separator + LAND_VALUE_TEMPLATE.replace("{0}", w + "")// .replace("{1}", h + "")); fileDir.mkdir(); File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml"); File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml"); try { PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile)); pw.print(sbForWidth.toString()); pw.close(); pw = new PrintWriter(new FileOutputStream(layyFile)); pw.print(sbForHeight.toString()); pw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static float change(float a) { int temp = (int) (a * 100); return temp / 100f; } public static void main(String[] args) { int baseW = 320; int baseH = 480; String addition = ""; try { if (args.length >= 3) { baseW = Integer.parseInt(args[0]); baseH = Integer.parseInt(args[1]); addition = args[2]; } else if (args.length >= 2) { baseW = Integer.parseInt(args[0]); baseH = Integer.parseInt(args[1]); } else if (args.length >= 1) { addition = args[0]; } } catch (NumberFormatException e) { System.err .println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;"); e.printStackTrace(); System.exit(-1); } new GenerateValueFiles(baseW, baseH, addition).generate(); }}
0 0
- Android多屏适配
- Android多屏适配
- android多屏适配
- Android多屏适配
- Android多屏适配
- Android多屏适配
- android多屏适配
- Android 多屏适配解决方案
- android 开发 多屏适配
- android布局与多屏适配---layout_weight
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- 哈夫曼树的创建与打印
- 4种访问权限及this引用
- 六种简单排序结构运行时间比较
- openwrt生成固件firmware过程
- WebRTC中的拥塞控制 二: RTP in WebRTC
- android多屏适配
- eclipse配置一
- 一日三醒吾身
- Android Data Binding(一)
- 数据结构实验:连通分量个数
- 自定义圆去除边角只有圆可以点击
- 韩文T9宫格输入法的实现
- JAX-WS在tomcat上发布Webservice
- C#语言和数据库技术基础 ----------------- 第二章 简答三 、