zoukankan      html  css  js  c++  java
  • Android 使用正则表达式来快速生成多套dpi及分分辨率适配的UI

      在Android开发中,往往为了适配dpi和分辨率,要写多套layout或者values,而鉴于dpi和分辨率的计算方式,很多时候适配的大部分工作都是简单的计算方面。譬如DPI从1.5到2.0,就是将所有dip、sp为单位的数值都乘以0.75(也就是1.5/2)。所以我们完成可以自己写一个小工具来批量读取layout或者values文件,然后进行批量操作并保存。

      对文件的批量打开读取操作我这里就不浪费周章了,大家可以自行查阅资料,这里主要贴出核心代码。

      

            FileInputStream inputStream = new FileInputStream(subFile);
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    inputStream));
            if (sb == null) {
                sb = new StringBuffer();
            }
            for (String s = reader.readLine(); s != null; s = reader.readLine()) {
                // 使用的是逐行读取,所以xml的格式必须每行都是完整的,不然会出现各种意想不到的结果。
                String temp = s;
                Pattern dpPattern = Pattern.compile(""(.+?)dp"");
                Matcher dpMatcher = dpPattern.matcher(temp);
                System.out.println(s);
                if (dpMatcher.find()) {
                    for (int gNum = 1; gNum <= dpMatcher.groupCount(); gNum++) {
                        System.out.println("dp");
                        System.out.println(dpMatcher.group(gNum));
                        temp = temp.replaceAll(dpMatcher.group(gNum),
                                Float.parseFloat(dpMatcher.group(gNum))
                                        * CHANGE_RATIO + "");
                    }
                }
                Pattern dipPattern = Pattern.compile(""(.+?)dip"");
                Matcher dipMatcher = dipPattern.matcher(temp);
                if (dipMatcher.find()) {
                    for (int gNum = 1; gNum <= dipMatcher.groupCount(); gNum++) {
                        System.out.println("dip");
                        System.out.println(dipMatcher.group(gNum));
                        temp = temp.replaceAll(dipMatcher.group(gNum),
                                Float.parseFloat(dipMatcher.group(gNum))
                                        * CHANGE_RATIO + "");
                    }
                }
                Pattern spPattern = Pattern.compile(""(.+?)sp"");
                Matcher spMatcher = spPattern.matcher(temp);
                if (spMatcher.find()) {
                    for (int gNum = 1; gNum <= spMatcher.groupCount(); gNum++) {
                        System.out.println("sp");
                        System.out.println(spMatcher.group(gNum));
                        temp = temp.replaceAll(spMatcher.group(gNum),
                                Float.parseFloat(spMatcher.group(gNum))
                                        * CHANGE_RATIO + "");
                    }
                }
                sb.append(temp + "
    ");
            }

     通过上述代码,我们可以发现逻辑很简单,就是找出“xxxdp”里面xxx的值,然后乘以一个转化系数CHANGE_RATIO而已,当我们要将dpi从1.5转成2.0的时候,就可以这么做了~该正则表达式适用于批量修改layout里的数值。如果是修改values里的dimens数值的话,我们可以将对应语句换为

    Pattern dpPattern = Pattern.compile(">(.+?)dp<");

      大家可以多开发一点这样的小工具,来提高平时的工作效率~

      

  • 相关阅读:
    jsp用equals判断两个字符串变量是否相等
    使用session在jsp页面之间传递多维数组,用于实现全局变量的效果
    C++实现对MySQL数据库的连接,以及增删改查
    VS2017项目中使用代码连接MySQL数据库,以及进行数据添加
    VS2017中遇到不存在从string到const char*的转换函数的解决方法
    windows系统转linux系统后磁盘的处理
    redis集群节点重启后恢复
    Jenkins 与Docker/Kubernetes的自动化CI流水(笔记)
    shell的运用 : jenkins 编译 打包前端发布 生产(tomcat)
    云服务器linux系统修改时间和时区
  • 原文地址:https://www.cnblogs.com/blairsProgrammer/p/4220929.html
Copyright © 2011-2022 走看看