Android 分辨率适配

本文探讨了Android应用程序如何进行屏幕分辨率适配,包括使用XML布局文件进行尺寸单位转换,理解dp、sp、px的关系,以及运用不同的资源目录实现不同屏幕尺寸的支持,旨在帮助开发者创建跨设备兼容的应用。

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

开发android项目,需要进行多分辨率适配,能够支持国内主流的分辨率手机,总结一下,分为三个阶段:
一、一开始再做适配工作如果分辨率很接近就使用同一套xml布局文件,分辨率差距较大就会重新写一套,这样会很耗时间。
二、后来使用dimens文件,通过在xml中使用dimens文件确实可以帮助我们省去大多数时间。但是最近又遇到一个问题,就是有新的机型需要适配时,特别是提测的前期,需要根据dpi和密度计算出新分辨率下各种宽高值,如果你的项目很庞大,那么工作量也是不小的,最关键问题是手动计算很可能会出错,后来就自己写了一个小东西,根据标准分辨率自动生成新分辨率的dimens文件,省去很多事。
三、在这份代码中,以960X540分辨率为参照,生成800X480和854X480两种分辨率的dimens文件,具体代码如下:
public class DimenTool {

    //参照分辨率dimens文件路径
    public static final String dimensPath = "D:/workspace/res/values-hdpi/dimens.xml";
    public static final String h800dimensPath = "D:/workspace/values-hdpi-800X480/dimens.xml";
    public static final String h854dimensPath = "D:/workspace/values-hdpi-854X480/dimens.xml";

    public static void main(String[] args) {
        produceDimens();
    }


    public static void produceDimens() {
        //以此文件夹下的dimens.xml文件内容为初始值参照
        File file = new File(dimensPath);
        BufferedReader reader = null;
//        StringBuilder mdpi = new StringBuilder();
        //hdpi-800x480
        StringBuilder h800 = new StringBuilder();
        //hdpi-854x480
        StringBuilder h854 = new StringBuilder();
        try {
            reader = new BufferedReader(new FileReader(file));
            String tempString;
            int line = 1;

            while ((tempString = reader.readLine()) != null) {
                if (tempString.contains("</dimen>")) {
                    String start = tempString.substring(0, tempString.indexOf(">") + 1);
                    String end = tempString.substring(tempString.lastIndexOf("<") - 2);
                    //截取<dimen></dimen>标签内的内容,从>右括号开始,到左括号减2,取得配置的数字
                    Double num = Double.parseDouble
                            (tempString.substring(tempString.indexOf(">") + 1,
                                    tempString.indexOf("</dimen>") - 2));
                    //此时区分vertical和horizontal,根据不同的尺寸计算新的值,拼接新的字符串,并且结尾处换行。
                    if(start.contains("vertical_dp")){
                        //mdpi.append(start).append(num / 1).append(end).append("\r\n");
                        h800.append(start).append((int)(num*5/6)).append(end).append("\r\n");
                        h854.append(start).append((int)(num*0.889)).append(end).append("\r\n");
                    }else if (start.contains("horizontal_dp")){
                        //mdpi.append(start).append(num / 1).append(end).append("\r\n");
                        h800.append(start).append((int)(num*8/9)).append(end).append("\r\n");
                        h854.append(start).append((int)(num*8/9)).append(end).append("\r\n");
                    }else{
                        h800.append(start).append(num).append(end).append("\r\n");
                        h854.append(start).append(num).append(end).append("\r\n");
                    }
                } else {
//                    mdpi.append(tempString).append("");
                    h800.append(tempString).append("");
                    h854.append(tempString).append("");
                }
                line++;
            }
            reader.close();
            System.out.println("<!--  h800 -->");
            System.out.println(h800);
            System.out.println("<!--  h854 -->");
            System.out.println(h854);
            String h800_file = h800dimensPath;
            String h854_file = h854dimensPath;
            writeFile(h800_file, h800.toString());
            writeFile(h854_file, h854.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    /**
     * 写入方法
     */

    public static void writeFile(String file, String text) {
        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、付费专栏及课程。

余额充值