Android屏幕适配万能尺寸生成方法

Android屏幕适配万能尺寸生成方法

本方法主要是根据各机型的屏幕像素比例来进行适配,当然你也可以根据自己的需求改成以dp为单位的尺寸适配,但是我个人觉得还是以px为单位好弄些

将此代码复制进自己的Android项目中 根据自己的需求修改后,执行main方法即可.

代码块

   public static void main(String[] args) throws Exception {
        float[] base = {480, 854};
        copys(resStr, base, "320,480;480,800;480,854;");
    }
    private final static String VALUE_TEMPLATE = "values-{0}x{1}";
    //"x1,y1;x2,y2;"
    private static final String SUPPORT_DIMESION = "320,480;480,800;480,854;540,960;600,1024;720,1184;720,1196;720,1280;768,1024;768,1280;800,1280;1080,1812;1080,1920;1440,2560;";

    /**
     * 主要原理就是将已经写好适配数据的dimens文件复制进需要适配的机型响应的values文件夹里,并在复制的过程中修改里面的尺寸值.
     * 但你要确保你的已经写好的适配文件里的数值是以此格式写的
     * x轴的数据(即控件的宽度)以"x_"开头
     * y轴的数据(即控件的高度)以"y_"开头
     * 值以px为单位,当然也可以自己将此方法改成以dp为单位
     * 其中文字大小可以用px为单位来写,以什么格式开头("x_"/"y_")随你,这样适配效果更好
     *     <dimen name="x_187.5">187.5px</dimen>
     *     <dimen name="x_77.3">77.3px</dimen>
     *     <dimen name="y_62.7">62.7px</dimen>
     *     <dimen name="y_102.7">102.7px</dimen>
     * @param resStr          res文件夹路径
     * @param base            标准宽度与标准高度
     * @param supportDimesion 需要生成的尺寸 可以直接在{@link ValuesFormat#SUPPORT_DIMESION}里找到自己需要适配的尺寸,加入supportDimesion中,也可以自定义尺寸添加
     * @throws IOException
     */
    private static void copys(File resStr, float[] base, String supportDimesion) throws IOException {
        //标准文件位置 ".\app\src\main\res\values\dimens.xml"
        File file = new File(new File(resStr + File.separator + "values"), "dimens.xml");
        float baseW = base[0];
        float baseH = base[1];
        int x = 0;
        int y = 0;

        String[] vals = supportDimesion.split(";");
        for (String val : vals) {
            String[] wh = val.split(",");
            x = Integer.parseInt(wh[0]);
            y = Integer.parseInt(wh[1]);
            //目标文件目录
            File valuesDir = new File(resStr + File.separator +
                    VALUE_TEMPLATE.replace("{0}", x + "").replace("{1}", y + ""));
            File valuesFile = new File(valuesDir, "dimens.xml");
            if (!valuesDir.exists()) {
                valuesDir.mkdir();
            }
            //宽度转换比例
            float scaleW = x / baseW;
            //高度转换比例
            float scaleH = y / baseH;
            float scale;
            //标准文件位置
            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
            //目标文件
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(valuesFile));
            //源文件中每行数据
            String line;
            //写入目标文件中每行数据
            String lines;
            while ((line = bufferedReader.readLine()) != null) {
                //<dimen name="xy10">187.5px</dimen>
                //转换定位
                int x_start = line.indexOf("x_");
                int y_start = line.indexOf("y_");
                int xy_start = line.indexOf("x_");
                int xy_end = line.indexOf("\"", xy_start);
                int x_end = line.indexOf("\"", x_start);
                int y_end = line.indexOf("\"", y_start);
                //判断写的每行数据是否有需要转换的内容
                if (x_start != -1 || y_start != -1) {
                    if (x_start != -1) {
                        scale = scaleW;
                        xy_start = x_start;
                        xy_end = x_end;
                    } else {
                        xy_start = y_start;
                        xy_end = y_end;
                        scale = scaleH;
                    }
                    //原值定位
                    int value_start = line.indexOf(">", xy_start) + 1;
                    int value_end = line.indexOf("px");
                    String value = line.substring(xy_start + 2, xy_end);//10
                    String value_a_s = line.substring(value_start, value_end);//187.5
                    //标准值
                    float value_a = Float.valueOf(value);//10.0
                    //转换比例后目标值
                    float value_b = value_a * scale;//15.0
                    //保留两位小数
                    String value_b_s = new Formatter().format("%.2f", value_b).toString();
                    //数值转换后的字符串
                    String replace = line.replace(value_a_s + "px", value_b_s + "px");
                    //标准dimens里的每一行需要更改的内容
                    System.out.println(line);
                    //尺寸适配后每一行的内容
                    System.out.println(replace);
                    System.out.println((x_start != -1 ? "X" : "Y") + "方向上" + "尺寸适配比例:" + scale + "起始位置:" + xy_start + "结束位置:" + xy_end + "取到的值名:" + value
                            + "取到的值:" + value_a_s + "标准值:" + value_a + "转换后的值:" + value_b_s + ":" + value_b);
                    //    <dimen name="x_187.5">187.5px</dimen>
                    //    <dimen name="x_187.5">281.25px</dimen>
                    //    起始位置:17结束位置:24取到的值名:187.5取到的值:187.5标准值:187.5转换后的值:281.25:281.25
                    lines = replace;
                } else {
                    lines = line;
                }
                bufferedWriter.write(lines);
                bufferedWriter.newLine();
                bufferedWriter.flush();
            }
            bufferedReader.close();
            bufferedWriter.close();
        }
    }

这里写图片描述

代码下载

http://download.csdn.net/detail/prczhb/9922455

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值