Android屏幕适配

November 6, 2017

老文章了,拿到个人站里。

生成适配文件,我们先创建工具类,通过工具类直接生成适配文件,放到工程中即可。

工具类

下面工具类中,列举了10余种屏幕尺寸,如果有特殊分辨率需要适配,在main方法中添加即可。

设计师标注通常会以某个尺寸为基准标注一套尺寸,下面工具类以 720 * 1280 分辨率为基准,实际开发过程中,与设计师保持一致即可。

MakeXml.java

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

/**
 * Created by kongqw on 2015/11/21.
 */
public class MakeXml {
    // Mac路径
    private final static String rootPath = "layoutroot/values-{0}x{1}/";
    // Windows 路径
    // private final static String rootPath = "C:\\layoutroot\\values-{0}x{1}\\";

    /**
     * 设置基准分辨率
     * 一般标注按照多大的图标,这里我们就设置多大尺寸
     */
    private final static float dw = 720f;
    private final static float dh = 1280f;

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

    // 手机分辨率
    public static void main(String [] args){
        makeString(320, 480);
        makeString(480, 800);
        makeString(480, 854);
        makeString(540, 960);
        makeString(600, 1024);
        makeString(720, 1184);
        makeString(720, 1196);
        makeString(720, 1280);
        makeString(768, 1024);
        makeString(800, 1280);
        makeString(1080, 1812);
        makeString(1080, 1920);
        makeString(1440, 2560);
    }

    public static void makeString(int w, int h) {

        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sb.append("<resources>");
        float cellw = w / dw;
        for (int i = 1; i < dw; i++) {
            sb.append(WTemplate.replace("{0}", i + "").replace("{1}", change(cellw * i) + ""));
        }
        sb.append(WTemplate.replace("{0}", "720").replace("{1}", w + ""));
        sb.append("</resources>");

        StringBuffer sb2 = new StringBuffer();
        sb2.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sb2.append("<resources>");
        float cellh = h / dh;
        for (int i = 1; i < dh; i++) {
            sb2.append(HTemplate.replace("{0}", i + "").replace("{1}", change(cellh * i) + ""));
        }
        sb2.append(HTemplate.replace("{0}", "1280").replace("{1}", h + ""));
        sb2.append("</resources>");

        String path = rootPath.replace("{0}", h + "").replace("{1}", w + "");
        File rootFile = new File(path);
        if (!rootFile.exists()) {
            rootFile.mkdirs();
        }
        File layxFile = new File(path + "lay_x.xml");
        File layyFile = new File(path + "lay_y.xml");
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
            pw.print(sb.toString());
            pw.close();
            pw = new PrintWriter(new FileOutputStream(layyFile));
            pw.print(sb2.toString());
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    public static float change(float a) {
        int temp = (int) (a * 100);
        return temp / 100f;
    }

}

生成适配文件

环境:MacBook Pro

创建MakeXml.java到某目录下。打开终端,进入到该目录。

  1. 生成class文件

    javac MakeXml.java
    

    在当前目录生成.class文件

  2. 生成适配文件

    java MakeXml
    

    在当前目录生成适配文件

使用

将生成的values-XXXxXXX全部拷贝到工程res目录下。

android:layout_width="@dimen/x24"
android:layout_height="@dimen/y24"