Android屏幕适配生成values文件工具类

亲测,例子完美。

直接将代码Copy到项目的Utils包下运行后即可自动生成(运行前需将基准分辨率改为UI图的分辨率)

/**
 * Android屏幕适配Dimens文件生成工具类
 * 参考:http://blog.csdn.net/guozhaohui628/article/details/71870530
 * http://blog.csdn.net/lmj623565791/article/details/45460089
 *
 * @author LTP 2017年8月15日
 */
public class AndroidDimensUtil {

    /**
     * 基准宽度和高度(通常设置成UI图的分辨率的高度和宽度)
     */
    private static final int baseHeight = 1920;
    private static final int baseWidth = 1080;

    /**
     * 生成Dimens文件的路径(项目的res文件夹)
     */
    private static String FILE_PATH;

    private static final String WidthTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";
    private static final String HeightTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n";

    public static void main(String[] args) {
        // 获取项目res文件的路径
        getResPath(new File("").getAbsolutePath());

        AndroidDimensUtil.createDimens(480, 320);
        AndroidDimensUtil.createDimens(800, 480);
        AndroidDimensUtil.createDimens(800, 600);
        AndroidDimensUtil.createDimens(854, 480);
        AndroidDimensUtil.createDimens(854, 540);
        AndroidDimensUtil.createDimens(960, 540);
        AndroidDimensUtil.createDimens(960, 640);
        AndroidDimensUtil.createDimens(1024, 600);
        AndroidDimensUtil.createDimens(1024, 768);
        AndroidDimensUtil.createDimens(1184, 720);
        AndroidDimensUtil.createDimens(1196, 720);
        AndroidDimensUtil.createDimens(1208, 720);
        AndroidDimensUtil.createDimens(1280, 720);
        AndroidDimensUtil.createDimens(1280, 768);
        AndroidDimensUtil.createDimens(1280, 800);
        AndroidDimensUtil.createDimens(1334, 750);
        AndroidDimensUtil.createDimens(1440, 900);
        AndroidDimensUtil.createDimens(1700, 1080);
        AndroidDimensUtil.createDimens(1776, 1080);
        AndroidDimensUtil.createDimens(1794, 1080);
        AndroidDimensUtil.createDimens(1800, 1080);
        AndroidDimensUtil.createDimens(1812, 1080);
        AndroidDimensUtil.createDimens(1920, 1080);
        AndroidDimensUtil.createDimens(1920, 1200);
        AndroidDimensUtil.createDimens(2160, 1080);
        AndroidDimensUtil.createDimens(2560, 1440);
        AndroidDimensUtil.createDimens(2560, 1600);

        // 添加以上分辨率都木有通用的,参考:http://blog.csdn.net/guozhaohui628/article/details/71870530
        AndroidDimensUtil.createCommonDimens(2);
    }

    /**
     * 生成相应分辨率的文件
     *
     * @param dimenHeight 要生成相应分辨率的高
     * @param dimenWidth  要生成相应分辨率的宽
     */
    @SuppressWarnings("ResultOfMethodCallIgnored")
    private static void createDimens(int dimenHeight, int dimenWidth) {
        // 生成Height
        StringBuilder sbForHeight = new StringBuilder();
        // 生成头
        sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
        // 计算倍数
        float scaleHeight = dimenHeight * 1.0f / baseHeight;
//        System.out.println("生成Height : " + dimenHeight + " , 基准Height : " + baseHeight + " , height比例 : " + scaleHeight);
        for (int i = 1; i < baseHeight; i++) {
            // 根据倍率(最终保留两位小数)生成
            sbForHeight.append(HeightTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(scaleHeight * i) + ""));
        }
        // 最后一个直接写成相应的高,不用计算
        sbForHeight.append(HeightTemplate.replace("{0}", baseHeight + "").replace("{1}", dimenHeight + ""));
        sbForHeight.append("</resources>");

        // 生成Width
        StringBuilder sbForWidth = new StringBuilder();
        sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");

        float scaleWidth = dimenWidth * 1.0f / baseWidth;
//        System.out.println("生成Width : " + dimenWidth + " , 基准Width : " + baseWidth + " , width比例 : " + scaleWidth);

        for (int i = 1; i < baseWidth; i++) {
            sbForWidth.append(WidthTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(scaleWidth * i) + ""));
        }
        sbForWidth.append(WidthTemplate.replace("{0}", baseWidth + "").replace("{1}", dimenWidth + ""));
        sbForWidth.append("</resources>");

        // 生成文件
        File dimenFile = new File(FILE_PATH + File.separator + "values-" + dimenHeight + "x" + dimenWidth);
        dimenFile.mkdirs();
        System.out.println("指定分辨率:" + dimenHeight + "x" + dimenWidth);

        File lay_xFile = new File(dimenFile.getAbsolutePath(), "lay_x.xml");
        File lay_yFile = new File(dimenFile.getAbsolutePath(), "lay_y.xml");

        try {
            PrintWriter printWriter = new PrintWriter(new FileOutputStream(lay_xFile));
            printWriter.print(sbForWidth.toString());
            printWriter.close();

            printWriter = new PrintWriter(new FileOutputStream(lay_yFile));
            printWriter.print(sbForHeight.toString());
            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成适配未找到对应分辨率设备的通用dimen文件(直接放置在values中,单位为px)
     *
     * @param commonDensity 通用density的值
     */
    @SuppressWarnings("ResultOfMethodCallIgnored")
    private static void createCommonDimens(int commonDensity) {
        float commonScale = 1.0f / commonDensity;

        // 生成Height
        StringBuilder sbForHeight = new StringBuilder();
        // 生成头
        sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
        for (int i = 1; i < baseHeight + 1; i++) {
            // 根据倍率(最终保留两位小数)生成
            sbForHeight.append(HeightTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(commonScale * i) + "").replace("px", "dp"));
        }
        sbForHeight.append("</resources>");

        // 生成Width
        StringBuilder sbForWidth = new StringBuilder();
        sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");

        for (int i = 1; i < baseWidth + 1; i++) {
            sbForWidth.append(WidthTemplate.replace("{0}", i + "").replace("{1}", leftTwoDecimal(commonScale * i) + "").replace("px", "dp"));
        }
        sbForWidth.append("</resources>");

        // 生成文件
        File dimenFile = new File(FILE_PATH + File.separator + "values");
        dimenFile.mkdirs();
        System.out.println("未指定的通用分辨率(values中)");

        File lay_xFile = new File(dimenFile.getAbsolutePath(), "lay_x.xml");
        File lay_yFile = new File(dimenFile.getAbsolutePath(), "lay_y.xml");

        try {
            PrintWriter printWriter = new PrintWriter(new FileOutputStream(lay_xFile));
            printWriter.print(sbForWidth.toString());
            printWriter.close();

            printWriter = new PrintWriter(new FileOutputStream(lay_yFile));
            printWriter.print(sbForHeight.toString());
            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    /**
     * 保留两位小数
     *
     * @param a 要保留的Float数值
     * @return 保留后的数值
     */
    private static float leftTwoDecimal(float a) {
        return (int) (a * 100) / 100f;
    }

    /**
     * 利用递归查询res文件夹的绝对路径并赋值
     *
     * @param filePath 文件路径
     */
    private static void getResPath(String filePath) {
        for (File file : new File(filePath).listFiles()) {
            if (file.isDirectory()) {
                // 递归
                //这里将列出所有的文件夹
                if (file.getAbsolutePath().contains("src") && file.getAbsolutePath().contains("res")) {
                    System.out.println("res路径:" + file.getAbsolutePath());
                    FILE_PATH = file.getAbsolutePath();
                    return;
                }
                getResPath(file.getAbsolutePath());
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值