安卓屏幕适配,dimens.xml生成工具,简要讲述一下使用方法

最近做屏幕适配,然后找到一个挺不错的生成器

废话不多说,简要说一下:

首先,在自己的dimens.xml按照:

<dimen name="dimens_1_dp">1dp</dimen>

样式把自己想要的尺寸写出来(demo里面的基本够你用了)

然后将demo内的 DPGeneratorUtils 文件直接复制到你的项目里面,点击运行,注意修改APP路径,

否则会失败。

private static final String root = "app/src/main/res/";//文件生成路径

文件内的

private static final float DP_BASE = 520;//520dp为基准

用来设置基准尺寸(我这边UI给的是520,虽然奇怪,但是为了自己方便,顺便可能有人不知道

这个基准是什么,简单地说就是UI给你的设计图的宽度(单位为dp))

然后是

private static final int[] dps = {360, 384, 392, 400, 410, 411,420,440, 480, 533, 592,
        600, 640, 662, 720, 768, 800, 811, 820, 900, 960, 961, 1024, 1280};//常见dp列表

这里面可以选择生成的dimens适配的dpi,一般来说够用了,有特殊需要你可以再加。

 

备注:如果临时需要添加尺寸,或者修改所有,先在原本的dimens添加后,再次运行DPGeneratorUtils 即可,尺寸会

替换和

布局中使用示例

<TextView
    android:layout_width="@dimen/dimens_115_dp"
    android:layout_height="@dimen/dimens_100_dp"
  >

好吧,资源貌似是要用C币的,我直接把代码放这里,直接复制就可以使用了

public class DPGeneratorUtils {

    private static final String HEAD = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";//头部
    private static final String START_TAG = "<resources>\n";//开始标签
    private static final String END_TAG = "</resources>\n";//结束标签


    private static final float DP_BASE = 520;//520dp为基准

    private static final int[] dps = {360, 384, 392, 400, 410, 411,420,440, 480, 533, 592,
            600, 640, 662, 720, 768, 800, 811, 820, 900, 960, 961, 1024, 1280};//常见dp列表

//    private static final String root = "/Users/zhouqiong/Downloads/PMSP/app/src/main/res/";
    private static final String root = "app/src/main/res/";//文件生成路径

    private static ExecutorService fixedThreadPool;//线程池,用于生成XML文件
    private static int size_thread = 5;//线程池大小


    private static DocumentBuilderFactory dbFactory;
    private static DocumentBuilder db;
    private static Document document;


    public static void main(String[] args) {
        try {
            dbFactory = DocumentBuilderFactory.newInstance();
            db = dbFactory.newDocumentBuilder();
            //将给定 URI 的内容解析为一个 XML 文档,并返回Document对象
            //记得改成自己当前项目的路径
            document = db.parse(root + "values/dimens.xml");


            //按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList
            NodeList dimenList = document.getElementsByTagName("dimen");
            if (dimenList.getLength() == 0) return;
            List<Dimen> list = new ArrayList<>();
            for (int i = 0; i < dimenList.getLength(); i++) {
                //获取第i个book结点
                Node node = dimenList.item(i);
                //获取第i个dimen的所有属性
                NamedNodeMap namedNodeMap = node.getAttributes();
                //获取已知名为name的属性值
                String atrName = namedNodeMap.getNamedItem("name").getTextContent();

                String value = node.getTextContent();

                System.out.println("+++atrName++++++++++++++++++++" + atrName);
                System.out.println("+++++++++++++value++++++++++" + value);

                list.add(new Dimen(atrName, value));
            }


            fixedThreadPool = Executors.newFixedThreadPool(size_thread);

            for (int i = 0; i < dps.length; i++) {
                XMLThread xmlThread = new XMLThread(i, list);
                fixedThreadPool.execute(xmlThread);//线程启动执行
            }


        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }


    }

    private static class XMLThread implements Runnable {

        private int index = 0;
        private List<Dimen> list;

        public XMLThread(int index, List<Dimen> list) {
            this.index = index;
            this.list = list;
        }

        @Override
        public void run() {
            //记得改成自己当前项目的路径
            generateXMl(list, index, root + "values-sw" + dps[index] + "dp/", "dimens.xml");
        }
    }


    private static void generateXMl(List<Dimen> list, int index, String pathDir, String fileName) {
        try {
            File diectoryFile = new File(pathDir);
            if (!diectoryFile.exists()) {
                diectoryFile.mkdirs();
            }
            File file = new File(pathDir + fileName);
            if (file.exists()) {
                file.delete();
            }
            FileWriter fileWriter = new FileWriter(file);
            fileWriter.write(HEAD);
            fileWriter.write(START_TAG);

            int size = list.size();
            String atrName;
            String value;
            for (int i = 0; i < size; i++) {
                atrName = list.get(i).getAtrName();
                value = list.get(i).getValue();

                String output = "\t<dimen name=\"" + atrName + "\">" +
                        roundString(Float.valueOf(value.substring(0, value.length() - 2)), index) +
                        value.substring(value.length() - 2) + "</dimen>\n";
                fileWriter.write(output);

            }

            fileWriter.write(END_TAG);
            fileWriter.flush();
            fileWriter.close();

            System.out.println("写入成功");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("写入失败");


        }
    }

    //精确到小数点后2位,并且四舍五入(因为有SW1280dp,基准是160dp,1dp=1px,
    // 如果精确到小数点后一位,四舍五入会有0.5dp误差,在sw1280dp中会有4PX误差,精确到小数点后2位,四舍五入,误差控制在1PX之内)
    private static String roundString(float data, int index) {
        String result = "";
        float floatResult = data * dps[index] / DP_BASE;
        DecimalFormat df = new DecimalFormat("0.00");
        result = df.format(floatResult);
        return result;
    }

    private static class Dimen {
        private String atrName;
        private String value;

        public Dimen(String atrName, String value) {
            this.atrName = atrName;
            this.value = value;
        }

        public String getAtrName() {
            return atrName;
        }

        public void setAtrName(String atrName) {
            this.atrName = atrName;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值