android屏幕适配,自动生成不同的dimens.xml详解

时间:2024-04-08 16:47:39

转载自:http://blog.csdn.net/hnzcdy/article/details/50628993#comments

 android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件。然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的dp或者sp单位。开发中发现,android屏幕适配需要用到很多的尺寸,每个尺寸都建立dimens.xml问价。每个文件中的数值都要按照比例去计算,一个一个拿着计算器去计算吗?这样太麻烦了。今天有一个好的办法,来为大家介绍一下。

     一、首先我们在工程的res文件夹下,建立不同尺寸的valuse配置文件夹。并在不同的文件夹下建立不同的dimens.xml文件。valuse为默认的工程配置,其余的为根据不同的尺寸适配用户自己新建。(这里以android studio 1.5为示例)

  android屏幕适配,自动生成不同的dimens.xml详解

     二、在工程的java文件夹下建立DimenTool.java文件。

   android屏幕适配,自动生成不同的dimens.xml详解

    三、DimenTool.java类的代码如下,已做了注释。
 
[java] view plain copy
  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.File;  
  4. import java.io.FileReader;  
  5. import java.io.FileWriter;  
  6. import java.io.IOException;  
  7. import java.io.PrintWriter;  
  8.   
  9. /** 
  10.  * Created by cdy on 2016/2/3. 
  11.  * 快速生成适配工具类 
  12.  */  
  13. public class DimenTool {  
  14.   
  15.     public static void gen() {  
  16.         //以此文件夹下的dimens.xml文件内容为初始值参照  
  17.         File file = new File("./app/src/main/res/values/dimens.xml");  
  18.   
  19.         BufferedReader reader = null;  
  20.         StringBuilder sw240 = new StringBuilder();  
  21.         StringBuilder sw480 = new StringBuilder();  
  22.         StringBuilder sw600 = new StringBuilder();  
  23.   
  24.         StringBuilder sw720 = new StringBuilder();  
  25.   
  26.         StringBuilder sw800 = new StringBuilder();  
  27.   
  28.         StringBuilder w820 = new StringBuilder();  
  29.   
  30.         try {  
  31.   
  32.             System.out.println("生成不同分辨率:");  
  33.   
  34.             reader = new BufferedReader(new FileReader(file));  
  35.   
  36.             String tempString;  
  37.   
  38.             int line = 1;  
  39.   
  40.             // 一次读入一行,直到读入null为文件结束  
  41.   
  42.             while ((tempString = reader.readLine()) != null) {  
  43.   
  44.   
  45.                 if (tempString.contains("</dimen>")) {  
  46.   
  47.                     //tempString = tempString.replaceAll(" ", "");  
  48.   
  49.                     String start = tempString.substring(0, tempString.indexOf(">") + 1);  
  50.   
  51.                     String end = tempString.substring(tempString.lastIndexOf("<") - 2);  
  52.                     //截取<dimen></dimen>标签内的内容,从>右括号开始,到左括号减2,取得配置的数字  
  53.                     Double num = Double.parseDouble  
  54.                             (tempString.substring(tempString.indexOf(">") + 1,   
  55.                                     tempString.indexOf("</dimen>") - 2));  
  56.   
  57.                     //根据不同的尺寸,计算新的值,拼接新的字符串,并且结尾处换行。  
  58.                     sw240.append(start).append( num * 0.75).append(end).append("\r\n");  
  59.   
  60.                     sw480.append(start).append(num * 1.5).append(end).append("\r\n");  
  61.   
  62.                     sw600.append(start).append(num * 1.87).append(end).append("\r\n");  
  63.   
  64.                     sw720.append(start).append(num * 2.25).append(end).append("\r\n");  
  65.   
  66.                     sw800.append(start).append(num * 2.5).append(end).append("\r\n");  
  67.   
  68.                     w820.append(start).append(num * 2.56).append(end).append("\r\n");  
  69.   
  70.   
  71.   
  72.                 } else {  
  73.                     sw240.append(tempString).append("");  
  74.   
  75.                     sw480.append(tempString).append("");  
  76.   
  77.                     sw600.append(tempString).append("");  
  78.   
  79.                     sw720.append(tempString).append("");  
  80.   
  81.                     sw800.append(tempString).append("");  
  82.   
  83.                     w820.append(tempString).append("");  
  84.   
  85.                 }  
  86.   
  87.                 line++;  
  88.   
  89.             }  
  90.   
  91.             reader.close();  
  92.             System.out.println("<!--  sw240 -->");  
  93.   
  94.             System.out.println(sw240);  
  95.   
  96.             System.out.println("<!--  sw480 -->");  
  97.   
  98.             System.out.println(sw480);  
  99.   
  100.             System.out.println("<!--  sw600 -->");  
  101.   
  102.             System.out.println(sw600);  
  103.   
  104.             System.out.println("<!--  sw720 -->");  
  105.   
  106.             System.out.println(sw720);  
  107.   
  108.             System.out.println("<!--  sw800 -->");  
  109.   
  110.             System.out.println(sw800);  
  111.   
  112.             String sw240file = "./app/src/main/res/values-sw240dp-land/dimens.xml";  
  113.   
  114.             String sw480file = "./app/src/main/res/values-sw480dp-land/dimens.xml";  
  115.   
  116.             String sw600file = "./app/src/main/res/values-sw600dp-land/dimens.xml";  
  117.   
  118.             String sw720file = "./app/src/main/res/values-sw720dp-land/dimens.xml";  
  119.   
  120.             String sw800file = "./app/src/main/res/values-sw800dp-land/dimens.xml";  
  121.   
  122.             String w820file = "./app/src/main/res/values-w820dp/dimens.xml";  
  123.             //将新的内容,写入到指定的文件中去  
  124.             writeFile(sw240file, sw240.toString());  
  125.   
  126.             writeFile(sw480file, sw480.toString());  
  127.   
  128.             writeFile(sw600file, sw600.toString());  
  129.   
  130.             writeFile(sw720file, sw720.toString());  
  131.   
  132.             writeFile(sw800file, sw800.toString());  
  133.   
  134.             writeFile(w820file, w820.toString());  
  135.   
  136.         } catch (IOException e) {  
  137.   
  138.             e.printStackTrace();  
  139.   
  140.         } finally {  
  141.   
  142.             if (reader != null) {  
  143.   
  144.                 try {  
  145.   
  146.                     reader.close();  
  147.   
  148.                 } catch (IOException e1) {  
  149.   
  150.                     e1.printStackTrace();  
  151.   
  152.                 }  
  153.   
  154.             }  
  155.   
  156.         }  
  157.   
  158.     }  
  159.   
  160.   
  161.     /** 
  162.      * 写入方法 
  163.      * 
  164.      */  
  165.   
  166.     public static void writeFile(String file, String text) {  
  167.   
  168.         PrintWriter out = null;  
  169.   
  170.         try {  
  171.   
  172.             out = new PrintWriter(new BufferedWriter(new FileWriter(file)));  
  173.   
  174.             out.println(text);  
  175.   
  176.         } catch (IOException e) {  
  177.   
  178.             e.printStackTrace();  
  179.   
  180.         }  
  181.   
  182.   
  183.   
  184.         out.close();  
  185.   
  186.     }  
  187.     public static void main(String[] args) {  
  188.   
  189.         gen();  
  190.   
  191.     }  
  192.   
  193. }  

三、在建立项目的过程中,首先配置初始默认的dimens.xml文件,其余的尺寸先不用管。项目的所有配置结束后,在DimenTool.java类中,右键Run DimenTool.main执行这段代码,就可以在指定的个路径dimens.xml文件中按照事先设置好的比例参数,生成对应的适配。

android屏幕适配,自动生成不同的dimens.xml详解

        四、在控制台看到正确的输出结果,表明自动生成的适配数据生成完成。各个尺寸的values文件夹中的dimens.xml中也有相应的值。

       android屏幕适配,自动生成不同的dimens.xml详解

android屏幕适配,自动生成不同的dimens.xml详解