Android 智能屏幕适配工具,便捷有效(改进版,解决很多资源没有用占用空间)

此工具参考了其他的屏幕适配方法,改进而来的。

主要原理是以一个分辨率为基准,我这边以1280*720为例子,并且我的手机是该分辨率。美工切图也是这个分辨率。

这样切图后,在1280*720效果肯定是符合的。

如果我们把它放到2560*1440分辨率上面他会是怎么样的效果呢?

比如在1280*720     宽度为 720px 刚好是 满宽

那在2560*1440上面, 则是    1440/720 720px=1440    结果在此分辨率上依然是 满屏

其实就是以720p 为基准,在不同的分辨率相对比例。

 

使用方法如下:

C:\screen\res 这里面将会生成 对应的分辨率不同文件

 

 

C:\screen\src 这里放2个文件:(我们以1280 720分辨率为基准)

dimens_h.xml  //高度的px

dimens_w.xml //宽度的px   这里面就按平时的写进去即可

 

将文件放好后,运行jar即可,自动生成文件

 

源码如下,源码很简单,最好大家看下,方便自己也捣鼓捣鼓。

package com.example.administrator.customscrollview;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * Created by ferris  
 * 2015年10月16日 18:00:30
 * 459821731@qq.com
 */
public class ScreenMain {
    private int baseW;
    private int baseH;
    private String dirStr = "c:/screen/res";
    private String inputSrc="c:/screen/src";
    private String inputStrW="c:/screen/src/dimens_w.xml";
    private String inputStrH="c:/screen/src/dimens_h.xml";
    private final static String WTemplate = "<dimen name=\"{0}\">{1}px</dimen>\n";
    private final static String HTemplate = "<dimen name=\"{0}\">{1}px</dimen>\n";
    private final static String VALUE_TEMPLATE = "values-{0}x{1}";
    private static final String SUPPORT_DIMESION = "480,800;480,854;540,960;600,1024;720,1184;720,1196;720,1280;768,1024;800,1280;1080,1812;1080,1920;1440,2560;";

    private List<SizeBeam> currentSizesW,currentSizesH;
    public ScreenMain(int baseX, int baseY) {
        this.baseW = baseX;
        this.baseH = baseY;
        File dir = new File(dirStr);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File inputSrcf = new File(inputSrc);
        if (!inputSrcf.exists()) {
            inputSrcf.mkdirs();
        }
          

    }

    public void generate() {

    	if(currentSizesW==null||currentSizesW.size()<=0){
    		return;
    	}
        String[] vals = SUPPORT_DIMESION.split(";");
        for (String val : vals) {
            String[] wh = val.split(",");
            generateXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1]));
        }
    }


    private void generateXmlFile(int w, int h) {

        StringBuffer sbForWidth = new StringBuffer();
        sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sbForWidth.append("<resources>\n");
        float cellw = w * 1.0f / baseW;//把当前的宽度,按720分,每份占用多少

       
        for (int i = 0; i < currentSizesW.size(); i++) {
            sbForWidth.append(WTemplate.replace("{0}", currentSizesW.get(i).getName()).replace("{1}",
                    change(cellw * currentSizesW.get(i).getSize()) + ""));
        }
        
        sbForWidth.append("</resources>");
        
        StringBuffer sbForHeight = new StringBuffer();
        sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sbForHeight.append("<resources>\n");
        float cellh = h *1.0f/ baseH;
 
        for (int i = 0; i < currentSizesH.size(); i++) {
            sbForHeight.append(HTemplate.replace("{0}", currentSizesH.get(i).getName()).replace("{1}",
                    change(cellh * currentSizesH.get(i).getSize()) + ""));
        }
      
        sbForHeight.append("</resources>");

       
        
        File fileDir = new File(dirStr + File.separator
                + VALUE_TEMPLATE.replace("{0}", h + "")//
                .replace("{1}", w + ""));
        fileDir.mkdir();

        File layxFile = new File(fileDir.getAbsolutePath(), "dimens_w.xml");
        File layyFile = new File(fileDir.getAbsolutePath(), "dimens_h.xml");
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
            pw.print(sbForWidth.toString());
            pw.close();
            pw = new PrintWriter(new FileOutputStream(layyFile));
            pw.print(sbForHeight.toString());
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

	public static float change(float a) {
		int temp = (int) (a * 100);
		return temp / 100f;
	}
    
    public void AnalyticalXml() {
        File dirW = new File(inputStrW);
        if (!dirW.exists()) {
            System.out.print("请放入dimens_w.xml");
            return;
        }

        
        File dirH = new File(inputStrH);
        if (!dirH.exists()) {
            System.out.print("请放入dimens_h.xml");
            return;
        }
       
           try {
        	   currentSizesW=readXML(dirW);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       
         
          
              try {
            	  currentSizesH=readXML(dirH);
   		} catch (Exception e) {
   			// TODO Auto-generated catch block
   			e.printStackTrace();
   		}
              
              

    }

	public static List<SizeBeam> readXML(File dir) throws Exception {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document document = db.parse(dir);
		NodeList list = document.getElementsByTagName("dimen");
		int size = list.getLength();
		List<SizeBeam> sizes = new ArrayList<SizeBeam>();
		for (int i = 0; i < size; i++) {

			Element element = (Element) list.item(i);

			String name = element.getAttribute("name");
			String px = element.getFirstChild().getTextContent();
			if (px.endsWith(px)) {
				px = px.substring(0, px.length() - 2);
			}
			sizes.add(new SizeBeam(name, Float.parseFloat(px)));
		}
		return sizes;

	}



    public static void main(String[] args) {
        int baseW = 720;
        int baseH = 1280;
        ScreenMain run= new ScreenMain(baseW, baseH);
        run.AnalyticalXml();
        run.generate();
    }
}


http://download.csdn.net/detail/xufeifandj/9187399 

项目下载地址

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重播

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值