Android 屏幕适配方案(包含生成程序dp sp与解决方案)

看之前希望先看:

http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023

此方案是看完上面的了博客总结出来的

方案1与方案2兼容~ 因为都是x? y? font?为名称

方案1:

//values-xhdpi.. Dp的适配 与 values-xhdpi.. Sp的适配

这种适合 默认的那种 要是想非常精确 就考虑额外添加下面那个 的方案

按照以上计算方式,大致可以将市场上的手机划分为5个像素密度等级,具体如下:

(1) ldpi:120dpi,像素密度与dp转换关系为:1dp = 0.75px

(2) mdpi:160dpi ,像素密度与dp转换关系为:1dp = 1px

(3) hdpi:240dpi,像素密度与dp转换关系为:1dp = 1.5px

(4) xhdpi:320dpi,像素密度与dp转换关系为:1dp = 2px

(5) xxhdpi:480dpi,像素密度与dp转换关系为:1dp = 3px

核心思想

基准: 不当成像素 当成多少份 已320*480 生成的文件夹values-ldpi为例

dw:320 dh:480

x1(代表 基准中的一份既 1/320) :

            case ldpi:
                resultDp=dx/0.75F;
                break;
            case mdpi:
                resultDp=dx;
                break;
            case hdpi:
                resultDp=dx/1.5F;
                break;
            case xhdpi:
                resultDp=dx/2F;
                break;
            case xxhdpi:
                resultDp= dx/3F;    

格式如下:

<dimen name="font21px">21.0sp</dimen>//font
<dimen name="x2">2.0dp</dimen>//lay_x
<dimen name="y2">2.0dp</dimen>//lay_y

方案2:

以此为例://values-1024x600… 的适配

缺点

因为这个是严格按照1024*600的 所以碰到差不多的机型但是不完全匹配的时候 还的依靠xdpi xxdpi mdpi那四个文件夹内的属性

核心思想

基准: 不当成像素 当成多少份 已320*480 生成的文件夹values-1920x1080为例

x1(代表 基准中的一份既 1/320) :1080/320*1(以1080 分成320份在取一份)=3.375px;

y1同上1920/480=4px;

方案一dp代码:

package 适配;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
//values-xhdpi..  Dp的适配
public class MakeXml_Dp {

    private final static String rootPath = "C:\\Users\\Administrator\\Desktop\\layoutroot\\{0}\\";

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

    private final static float dw = 320f;//w迭代的像素
    private final static float dh = 480f;//h迭代的像素

    public enum DPI{
        ldpi("values-ldpi") ,mdpi("values-mdpi"),hdpi("values-hdpi"),xhdpi("values-xhdpi"),xxhdpi("values-xxhdpi");
        public String  fileName;
        DPI(String  fileName){
            this.fileName=fileName;
        };
        public float dx2dp(int dx){
            float resultDp=0F;
            switch (this) {
            case ldpi:
                resultDp=dx/0.75F;
                break;
            case mdpi:
                resultDp=dx;
                break;
            case hdpi:
                resultDp=dx/1.5F;
                break;
            case xhdpi:
                resultDp=dx/2F;
                break;
            case xxhdpi:
                resultDp= dx/3F;
                break;
            }
            return change(resultDp);
        }
    }
    //保留两位小数
    public static float change(float a) {
        return Math.round( a * 100 ) / 100.0F;
    }

    public static void main(String[] args) {
        System.out.println(change(0.33F));
        for (DPI item : DPI.values())
             makeFile(item);
    }

    public static void makeFile(DPI item) {

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

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

        String path = rootPath.replace("{0}", item.fileName );
        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();
        }

    }

}

方案一sp代码:

package 适配;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
//values-xhdpi..   Sp的适配
public class MakeXml_Sp {
    private final static String rootPath = "C:\\Users\\Administrator\\Desktop\\layoutroot\\{0}\\";
    private final static String WTemplate = "<dimen name=\"font{0}px\">{1}sp</dimen>\n";

    //font px 迭代 from -to
    private final static int from = 20;//w迭代的像素
    private final static int to =50;//h迭代的像素

    public enum DPI{
        ldpi("values-ldpi") ,mdpi("values-mdpi"),hdpi("values-hdpi"),xhdpi("values-xhdpi"),xxhdpi("values-xxhdpi");
        public String  fileName;
        DPI(String  fileName){
            this.fileName=fileName;
        };
        public float dx2sp(int dx){
            float resultSp=0F;
            switch (this) {
            case ldpi:
                resultSp=dx/0.75F;
                break;
            case mdpi:
                resultSp=dx;
                break;
            case hdpi:
                resultSp=dx/1.5F;
                break;
            case xhdpi:
                resultSp=dx/2F;
                break;
            case xxhdpi:
                resultSp= dx/3F;
                break;
            }
            return change(resultSp);
        }
    }
    //保留两位小数
    public static float change(float a) {
        return Math.round( a * 100 ) / 100.0F;
    }

    public static void main(String[] args) {
        //生成文件
        for (DPI item : DPI.values())
             makeFile(item);

        //单个分辨率的转换
        int fontPx=10;//10px转换sp 各个分辨率的
        for (DPI item : DPI.values()) {
            System.out.println(item.fileName+"------>font"+fontPx+"px-->"+item.dx2sp(fontPx)+"sp");
        }
    }

    public static void makeFile(DPI item) {

        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sb.append("<resources>");
        for (int i = from; i <=to; i++) {
            sb.append(WTemplate.replace("{0}", i + "").replace("{1}",item.dx2sp(i) + ""));
        }
        sb.append("</resources>");

        String path = rootPath.replace("{0}", item.fileName );
        File rootFile = new File(path);
        if (!rootFile.exists()) {
            rootFile.mkdirs();
        }
        File layxFile = new File(path + "font.xml");
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
            pw.print(sb.toString());
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

}

方案二代码:

package 适配;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

//values-1024x600... 适配
public class MakeXml2 {

    private final static String rootPath = "C:\\Users\\Administrator\\Desktop\\layoutroot\\values-{0}x{1}\\";

    private final static float dw = 320f;//不当成像素 当成多少份
    private final static float dh = 480f;

    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) {
        makeFile(320, 480);
        makeFile(480,800);
        makeFile(480, 854);
        makeFile(540, 960);
        makeFile(600, 1024);
        makeFile(720, 1184);
        makeFile(720, 1196);
        makeFile(720, 1280);
        makeFile(768, 1024);
        makeFile(800, 1280);
        makeFile(1080, 1812);
        makeFile(1080, 1920);//x1(代表 基准中的一份既  1/320) :1080/320*1(以1080 分成320份在取一份)=3.375px;
        makeFile(1440, 2560);
    }

    public static void makeFile(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("</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("</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) {
        return Math.round( a * 100 ) / 100.0F;
    }
}
时间: 2024-10-04 15:37:23

Android 屏幕适配方案(包含生成程序dp sp与解决方案)的相关文章

原创,实用Android 屏幕适配方案分享

(说来惭愧,这段时间忙项目,有时间也拿来调侃人生,好久没有写过技术文章了) 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案. 已经用在一款成熟互联网 应用中,效果还不错. 说起android开发,UI界面的多机型适配,一向是个很重要的问题. 网上这方面的文章很多,面试的时候也经常会问到,大部分的内容都很类似,无外乎用dp,sp 不要用px之类老生常谈的问题. 但是会说的居多,实际可以执行的可行方案,很少有人会. 我在面试的时候,很多人连drawab

Android 屏幕适配方案(百分比)

博客源址:Android 屏幕适配方案 1.概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象: 为什么Web页面设计人员从来没有说过,尼玛适配好麻烦? 那么,到底是什么原

开源,原创,实用Android 屏幕适配方案分享

说来惭愧,这段时间忙项目,有时间也拿来调侃人生,好久没有写过技术文章了) 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案.   已经用在一款成熟互联网 应用中,效果还不错 http://www.meilijie.com/ask/view/377116/http://www.meilijie.com/ask/view/377668/http://www.meilijie.com/ask/view/377838/http://www.meilijie.

android屏幕适配,除了使用dp,还可以使用比例

在android中为了适应不同分辨率的屏幕,引入了密度无关像素density-independent pixes,也就是dip,也可以简写为dp.之所以是与密度无关,是因为android为不同的密度提供了不同的scale值,比如mdpi的值为1,hdpi为1.5,xhdpi为2.这样,如果使用相同的dp值,系统在转换为px时,会使用dp*scale值,这样得到的比例大家都相同,而比例相同了,也就意味着屏幕适配了.如480*800,4.0inch的屏幕,为hdpi.屏幕的一半可以用160dp表示,

android屏幕适配方案

曾经看了android的屏幕适配方案,有非常多种.当中自己用到的一种是:先找一款主流的分辨率的android机,如:1080*1920的分辨率做基准,然后在这个基准上.调整好一切布局.图片.适配其它手机分辨率的手机.用百分比来调节.比如:在480*800的主流手机上,写了一个height=520,那么在480*800的手机上,这个控件的高度则为 480height = 520 * 屏幕高度/1920. 这种方案做屏幕适配. 项目遇到一个问题. 在剩余空间里.在1080*1920的手机上适配非常好

Cocos2dx-Android屏幕适配方案

本文转载于http://www.cnblogs.com/zisou/p/cocos2d-xJIqiao3.html 先感叹一下吧~~android的各种分辨率各种适配虐我千百遍,每次新项目我依旧待它如初恋···· 每家公司都有自己项目工程适配的方案,这种东西就是没有最好,只有最适合!!! 这次新项目专项针对android,目的性强,适配方案我觉得2套图去兼容android各种分辨率: 我们先了解一下android手机上的屏幕密度: Android主要有以下几种屏: QVGA和WQVGA屏dens

Android屏幕尺寸与度量单位(px,dp,sp)简介

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

Android 屏幕适配方案(转载)

3.百分比的引入 1.引入 其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹. 如下图: 然后我们根据一个基准,为基准的意思就是: 比如480*320的分辨率为基准 宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320 高度为480,将任何分辨率的高度分为480份,取值为y1-y480 例如对于800*480的宽度480: 可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ; 其他分辨率类似~~ 你可能会问,这么多文件,难道

Android 屏幕适配方案

http://www.pento.cn/board/29243127 http://www.pento.cn/board/29243128 http://www.pento.cn/board/29243133 http://www.pento.cn/board/29243129 http://www.pento.cn/board/29243131 http://www.pento.cn/board/29243130 http://www.pento.cn/board/29243132 http: