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 + "\n");
        }

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

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

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

  

时间: 2024-12-19 07:02:56

Android 使用正则表达式来快速生成多套dpi及分分辨率适配的UI的相关文章

Android Studio 配置快速生成模板代码

前言 Android studio 有提供快速生成模板代码的功能,其实这个功能也可以自定义配置.此篇博客将讲解如何使用此功能 进入Settings 选择 Editor > Live Templates 创建一个自己的组 为了不与Android studio已经自带的模型代码混淆,我们创建一个自己的组来管理自己的模板代码,请看下图: 下图点击 + 号 ,有2个选择 1.第一个选择是在当前组里新建一个模板代码 2.第二个就是生成一个组,我已经创建了一个叫user的组 编辑代码模板 下图就是生成模板代

Google API快速生成QR二维码

Google API快速生成QR二维码 现在来说生成二维码最简单的方法是使用Google Chart API来实现,再次膜拜Google大神- Google Chart API是一套可以让你在线生成报表图的系统,通过URL你可以得到各种图表.举个例子:你在浏览器中输入 https://chart.googleapis.com/chart?cht=qr&chs=200×200&choe=UTF-8&chld=L|4&chl=http://Codeup.org 你将得到一个内容

.net快速生成静态网页的方法一

一般用.net生成静态化网页方法有两种,一般是通过浏览器去触发动态的.aspx文件来达到解析网页,然后再生成网页,这种方法我们不用(因为这种方法需要浪费比较大的服务器性能,而且速度比较慢,一秒大概只能生成10个网页左右),所以我们今天要讲的是第二种方法,写一个网页模板,然后再用.net去解析标签,然后以完成这一个生成网页静态化功能(独占网络(http://www.sz886.com)-深圳网站建设-http://www.sz886.com技术人员测试过1秒可以生成100多个网页,性能非常好而且稳

企业信息化-Excel快速生成系统

企业信息化,主要是指对企业生产运营过程所形成的信息数字化,最终形成了数字资产.大型企业为了节约成本,提高协同工作效率,都会定制ERP.办公OA.流程审批等系统做信息化支撑.但是中小企业精力投入到生成中,对信息化也有需求,但是因为各种原因不能投入的信息系统的建设,主要原因有: 1.资金申请难:一套软件系统,从几万到几十万都有,在成长的企业主要资金投入到生成过程,不能有太多的资金投入: 2.需求满足难:每个企业都有自己的规则和灵活处理的机制,并且随着政策和外部环境的变化,企业内部信息需求处理也是不断

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中

如何快速生成视觉需求?

不少产品经理认为画视觉稿是视觉设计师的事情,所以偷懒也不整理视觉需求给到对方,最后验收发现缺少部分视觉稿,或者画出的视觉稿和PM要求的差异很大.介绍我自己研究出来的快速交付视觉需求的方法论,绝对值得学一学. 只有当PM将所有的视觉需求一一交付给视觉设计师,才能保证视觉设计师全面了解PM的设计思想,以及不会漏做相应的线框图. 一.需要交付的内容 刚入门的PM可能简单的把所有原型一股脑丢给视觉设计师,可能连当前版本还是所有版本都不区分.也不会区分线框图和交互图.视觉设计师只能自己琢磨,以及主动来问你

Logo图标快速生成软件(Sothink Logo Maker) v3.5 官方设计师版

Logo图标快速生成软件(Sothink Logo Maker) v3.5 官方设计师版 下载地址:http://www.cr173.com/soft/10238.html 硕思logo设计师怎么把背景logo去掉? http://jingyan.baidu.com/article/c275f6bac03b22e33c75674b.html 1.制作好LOGO之后,首先导出SVG文件,而不是直接导出图片,保存好. 2.利用浏览器打开存好的SVG文件. 3.右键保存为png或者bmp位图文件. 4

[转]Oracle dbms_random函数用法快速生成多条测试数据

做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法. 首先模拟一下100条的随机数据 [sql] view plaincopyprint? select rownum as id, to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime, trunc(dbms_rand

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"