最近做屏幕適配,然後找到一個挺不錯的生成器
廢話不多說,簡要說一下:
首先,在自己的dimens.xml按照:
<dimen name="dimens_1_dp">1dp</dimen>
樣式把自己想要的尺寸寫出來(demo裏面的基本夠你用了)
然後將demo內的 DPGeneratorUtils 文件直接複製到你的項目裏面,點擊運行,注意修改APP路徑,
否則會失敗。
private static final String root = "app/src/main/res/";//文件生成路徑
文件內的
private static final float DP_BASE = 520;//520dp爲基準
用來設置基準尺寸(我這邊UI給的是520,雖然奇怪,但是爲了自己方便,順便可能有人不知道
這個基準是什麼,簡單地說就是UI給你的設計圖的寬度(單位爲dp))
然後是
private static final int[] dps = {360, 384, 392, 400, 410, 411,420,440, 480, 533, 592, 600, 640, 662, 720, 768, 800, 811, 820, 900, 960, 961, 1024, 1280};//常見dp列表
這裏面可以選擇生成的dimens適配的dpi,一般來說夠用了,有特殊需要你可以再加。
備註:如果臨時需要添加尺寸,或者修改所有,先在原本的dimens添加後,再次運行DPGeneratorUtils 即可,尺寸會
替換和
佈局中使用示例
<TextView android:layout_width="@dimen/dimens_115_dp" android:layout_height="@dimen/dimens_100_dp" >
好吧,資源貌似是要用C幣的,我直接把代碼放這裏,直接複製就可以使用了
public class DPGeneratorUtils { private static final String HEAD = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";//頭部 private static final String START_TAG = "<resources>\n";//開始標籤 private static final String END_TAG = "</resources>\n";//結束標籤 private static final float DP_BASE = 520;//520dp爲基準 private static final int[] dps = {360, 384, 392, 400, 410, 411,420,440, 480, 533, 592, 600, 640, 662, 720, 768, 800, 811, 820, 900, 960, 961, 1024, 1280};//常見dp列表 // private static final String root = "/Users/zhouqiong/Downloads/PMSP/app/src/main/res/"; private static final String root = "app/src/main/res/";//文件生成路徑 private static ExecutorService fixedThreadPool;//線程池,用於生成XML文件 private static int size_thread = 5;//線程池大小 private static DocumentBuilderFactory dbFactory; private static DocumentBuilder db; private static Document document; public static void main(String[] args) { try { dbFactory = DocumentBuilderFactory.newInstance(); db = dbFactory.newDocumentBuilder(); //將給定 URI 的內容解析爲一個 XML 文檔,並返回Document對象 //記得改成自己當前項目的路徑 document = db.parse(root + "values/dimens.xml"); //按文檔順序返回包含在文檔中且具有給定標記名稱的所有 Element 的 NodeList NodeList dimenList = document.getElementsByTagName("dimen"); if (dimenList.getLength() == 0) return; List<Dimen> list = new ArrayList<>(); for (int i = 0; i < dimenList.getLength(); i++) { //獲取第i個book結點 Node node = dimenList.item(i); //獲取第i個dimen的所有屬性 NamedNodeMap namedNodeMap = node.getAttributes(); //獲取已知名爲name的屬性值 String atrName = namedNodeMap.getNamedItem("name").getTextContent(); String value = node.getTextContent(); System.out.println("+++atrName++++++++++++++++++++" + atrName); System.out.println("+++++++++++++value++++++++++" + value); list.add(new Dimen(atrName, value)); } fixedThreadPool = Executors.newFixedThreadPool(size_thread); for (int i = 0; i < dps.length; i++) { XMLThread xmlThread = new XMLThread(i, list); fixedThreadPool.execute(xmlThread);//線程啓動執行 } } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } private static class XMLThread implements Runnable { private int index = 0; private List<Dimen> list; public XMLThread(int index, List<Dimen> list) { this.index = index; this.list = list; } @Override public void run() { //記得改成自己當前項目的路徑 generateXMl(list, index, root + "values-sw" + dps[index] + "dp/", "dimens.xml"); } } private static void generateXMl(List<Dimen> list, int index, String pathDir, String fileName) { try { File diectoryFile = new File(pathDir); if (!diectoryFile.exists()) { diectoryFile.mkdirs(); } File file = new File(pathDir + fileName); if (file.exists()) { file.delete(); } FileWriter fileWriter = new FileWriter(file); fileWriter.write(HEAD); fileWriter.write(START_TAG); int size = list.size(); String atrName; String value; for (int i = 0; i < size; i++) { atrName = list.get(i).getAtrName(); value = list.get(i).getValue(); String output = "\t<dimen name=\"" + atrName + "\">" + roundString(Float.valueOf(value.substring(0, value.length() - 2)), index) + value.substring(value.length() - 2) + "</dimen>\n"; fileWriter.write(output); } fileWriter.write(END_TAG); fileWriter.flush(); fileWriter.close(); System.out.println("寫入成功"); } catch (IOException e) { e.printStackTrace(); System.out.println("寫入失敗"); } } //精確到小數點後2位,並且四捨五入(因爲有SW1280dp,基準是160dp,1dp=1px, // 如果精確到小數點後一位,四捨五入會有0.5dp誤差,在sw1280dp中會有4PX誤差,精確到小數點後2位,四捨五入,誤差控制在1PX之內) private static String roundString(float data, int index) { String result = ""; float floatResult = data * dps[index] / DP_BASE; DecimalFormat df = new DecimalFormat("0.00"); result = df.format(floatResult); return result; } private static class Dimen { private String atrName; private String value; public Dimen(String atrName, String value) { this.atrName = atrName; this.value = value; } public String getAtrName() { return atrName; } public void setAtrName(String atrName) { this.atrName = atrName; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }