android 多尺寸生产xml

本文介绍了一种用于不同分辨率设备上动态生成XML资源文件的算法。该算法通过计算特定比例因子来转换像素值为密度无关像素(dp),适用于多种屏幕尺寸,包括手机和平板设备。文中提供了具体实现代码及参数说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多尺寸目录

多尺寸目录
values-sw600dp 适配平板
values-zh-rCN 适配中英文

算法

v =dpi/160/defaultWidth * width * v1

v 最后写入文件的值
dpi 需要适配的手机dpi
defaultWidth 设计中给出的模板宽度
width 需要生成的屏幕宽度
v1 需要生成值的范围 0 < v1 < defaultWidth

动态生成xml

 static float hdpiScale = 1.5f;//240 dpi
    static float xhdpiScale = 2f;//320 dpi
    static float xxhdpiScale = 3f;//480dpi

    static float xx515 = 515f/160;

    static float xx_xhdpiScale = 3.5f;//560dpi
    static float xxxhdpiScale = 4f;//640dpi
    static int start = 0;
    static int end = 380;
    static final int defaultWidth=375;
    public static void main() {

        writeFileByWidth(480,hdpiScale,"res/values-hdpi/dimens.xml");
        writeFileByWidth(720D,xhdpiScale,"res/values-xhdpi/dimens.xml");
        writeFileByWidth(1080D,xxhdpiScale,"res/values-xxhdpi/dimens.xml");
        writeFileByWidth(1440D,xx_xhdpiScale,"res/values-xxxhdpi-2560x1440/dimens.xml");

        writeFileByWidth(1440D,515f/160,"res/values-xxhdpi-2560x1440/dimens.xml");

        writeFileByWidth(1440D,xxxhdpiScale,"res/values-xxxhdpi/dimens.xml");
        //平板
        writeFileByWidth(1600D,xhdpiScale,"res/values-sw600dp/dimens.xml");
    }


/**
* xDPI  240/160  320/160  480/160  640/160
* defaultwidth 参考的默认宽度
* width 需要生成的屏幕宽度
* fileName 生成后的文件名
*/

 public static void writeFileByWidth(double width,double xDPI,String fileName){
        double k=width/xDPI/defaultWidth;
        String content = getPxToDpDimens(start,end,k);
        System.out.println(fileName);
        System.out.println(content);
        writeFile(fileName,content);
    }

    public static String getPxToDpDimens(int start,int end,double k){
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        sb.append("\r\n").append("<resources>").append("\r\n");
        for (int i = start; i <= end; i++) {
            for (int j = 0; j < 2; j++) {
                float temp = i;
                if(j==1){
                    temp = (float) (i+0.5);
                }
                String st = "<dimen name=\"px_key_dp\">value_dp</dimen>";
                st = st.replaceAll("key", temp+"");
                st = st.replaceAll("value_",String.format("%.2f", k*temp));
                sb.append("\t").append(st).append("\r\n");
            }
        }
        sb.append("</resources>").append("\r\n");
        return sb.toString();
    }

    public static void writeFile(String filePaht, String text) {
        filePaht="app/src/main/"+filePaht;
        File file = new File(filePaht);
        File parent = file.getParentFile();
        if(!parent.exists()){
            parent.mkdirs();
        }
        PrintWriter out = null;
        try {
            out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
            out.println(text);
        } catch (IOException e) {
            e.printStackTrace();
        }
        out.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值