zoukankan      html  css  js  c++  java
  • Android开发——自动生成Android屏幕适配的dimens.xml文件

    使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力。现在整理出来分享给广大的Android程序员兄弟们,希望给他们的开发工作带来帮助。

    最近团队再做Android App的屏幕适配,按照官方的办法是layout文件引用dimen变量,  变量放在多个不同分辨率下的dimens.xml文件中,分别放在不同的目录下,

        ./app/src/main/res/values-sw480dp-land/dimens.xml  
        ./app/src/main/res/values-sw600dp-land/dimens.xml  
        ./app/src/main/res/values-sw720dp-land/dimens.xml  
        ./app/src/main/res/values-sw800dp-land/dimens.xml  
        ./app/src/main/res/values-w820dp/dimens.xml

    人工处理这些dimens.xml,感觉比较麻烦,就是个体力活,于是做了个工具类按比例自动化生成dimens.xml文件,效率瞬间提高了很多倍,如果需要特殊定义尺寸,放到另一个xml文件里面就行了。

    values/dimens.xml 文件示例

        <resources>  
    
            <!-- Default screen margins, per the Android Design guidelines. -->  
            <dimen name="activity_horizontal_margin">14dp</dimen>  
            <dimen name="activity_vertical_margin">14dp</dimen>  
    
            <dimen name="action_bar_height">50dp</dimen>  
            <dimen name="tab_height">81dp</dimen>  
            <dimen name="content_margin">18dp</dimen>  
            <dimen name="list_title_height">63dp</dimen>  
    
            <dimen name="report_table_header_height">54dp</dimen>  
            <dimen name="report_category_height">54dp</dimen>  
    
            <dimen name="fab_size_normal">72dp</dimen>  
            <dimen name="fab_margin">14dp</dimen>

    工具类代码,直接运行即可

        import java.io.BufferedReader;  
        import java.io.BufferedWriter;  
        import java.io.File;  
        import java.io.FileReader;  
        import java.io.FileWriter;  
        import java.io.IOException;  
        import java.io.PrintWriter;  
    
        /** 
         * 根据values/dimens.xml, 自动计算比例并生成不同分辨率的dimens.xml 
         * 注意用dp和sp,不要用dip,否则生成可能会出错;xml值不要有空格 
         * Created by zhangxitao on 15/9/22. 
         */  
        public class DimenTool {  
    
            public static void gen() {  
    
                File file = new File("./app/src/main/res/values/dimens.xml");  
                BufferedReader reader = null;  
                StringBuilder sw480 = new StringBuilder();  
                StringBuilder sw600 = new StringBuilder();  
                StringBuilder sw720 = new StringBuilder();  
                StringBuilder sw800 = new StringBuilder();  
                StringBuilder w820 = new StringBuilder();  
    
                try {  
                    System.out.println("生成不同分辨率:");  
                    reader = new BufferedReader(new FileReader(file));  
                    String tempString;  
                    int line = 1;  
                    // 一次读入一行,直到读入null为文件结束  
    
                    while ((tempString = reader.readLine()) != null) {  
    
                        if (tempString.contains("</dimen>")) {  
                            //tempString = tempString.replaceAll(" ", "");  
                            String start = tempString.substring(0, tempString.indexOf(">") + 1);  
                            String end = tempString.substring(tempString.lastIndexOf("<") - 2);  
                            int num = Integer.valueOf(tempString.substring(tempString.indexOf(">") + 1, tempString.indexOf("</dimen>") - 2));  
    
                            sw480.append(start).append((int) Math.round(num * 0.6)).append(end).append("/n");  
                            sw600.append(start).append((int) Math.round(num * 0.75)).append(end).append("/n");  
                            sw720.append(start).append((int) Math.round(num * 0.9)).append(end).append("/n");  
                            sw800.append(tempString).append("/n");  
                            w820.append(tempString).append("/n");  
    
                        } else {  
                            sw480.append(tempString).append("/n");  
                            sw600.append(tempString).append("/n");  
                            sw720.append(tempString).append("/n");  
                            sw800.append(tempString).append("/n");  
                            w820.append(tempString).append("/n");  
                        }  
                        line++;  
                    }  
                    reader.close();  
                    System.out.println("<!--  sw480 -->");  
                    System.out.println(sw480);  
                    System.out.println("<!--  sw600 -->");  
                    System.out.println(sw600);  
    
                    System.out.println("<!--  sw720 -->");  
                    System.out.println(sw720);  
                    System.out.println("<!--  sw800 -->");  
                    System.out.println(sw800);  
    
                    String sw480file = "./app/src/main/res/values-sw480dp-land/dimens.xml";  
                    String sw600file = "./app/src/main/res/values-sw600dp-land/dimens.xml";  
                    String sw720file = "./app/src/main/res/values-sw720dp-land/dimens.xml";  
                    String sw800file = "./app/src/main/res/values-sw800dp-land/dimens.xml";  
                    String w820file = "./app/src/main/res/values-w820dp/dimens.xml";  
                    writeFile(sw480file, sw480.toString());  
                    writeFile(sw600file, sw600.toString());  
                    writeFile(sw720file, sw720.toString());  
                    writeFile(sw800file, sw800.toString());  
                    writeFile(w820file, w820.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();  
            }  
    
            public static void main(String[] args) {  
                gen();  
            }  
        }
  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/exmyth/p/5367991.html
Copyright © 2011-2022 走看看