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

看之前希望先看:
http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023
此方案是看完上面的了博客总结出来的

名称都是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

核心思想

原理:x100就是standardDpi(参考图的DPI)下的100,其他文件夹(m,l,h,x,xx)下 则被缩放了

核心代码:

            public enum DPI{
    ldpi("values-ldpi",0.75F)   ,mdpi("values-mdpi",1.0F),hdpi("values-hdpi",1.5F),xhdpi("values-xhdpi",2F),xxhdpi("values-xxhdpi",3F);
        //  270*480->120dp 0.75    360*640->160dp 1     480*960->240dp 1.5    720*1280->320dp 2      1080*1920->480dp 3
        public String  fileName;
        public float radio;
        public static DPI standardDpi;
        DPI(String  fileName,float radio){
            this.fileName=fileName;
            this.radio=radio;
        };
        public float dx2dp(int dx){
            float resultDp=dx/radio;//转成 dx 通过DPI比率转成 dp
            if(standardDpi==null)
                throw new NullPointerException("standardDpi may be null");
            resultDp= resultDp*radio/standardDpi.radio;//在通过参考图的DPI进行对比 缩放;
            return change(resultDp);
        }
        public float dx2sp(int dx){
            return dx2dp(dx);
        }
        //保留两位小数
        public static float change(float a) {
            return Math.round( a * 100 ) / 100.0F;
        }
    }   

格式如下:

这里写图片描述

<dimen name="font21px">21.0sp</dimen>//font
<dimen name="x2">2.0dp</dimen>//lay_x
<dimen name="y2">2.0dp</dimen>//lay_y
经测试的Android代码:
  setContentView(R.layout.activity_main);
        float px = getResources().getDimension(R.dimen.x100);
        System.out.println("x100---->"+px+"px");
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);//display = getWindowManager().getDefaultDisplay();display.getMetrics(dm)(把屏幕尺寸信息赋值给DisplayMetrics dm);
        System.out.println("width:"+dm.widthPixels+"\t height:"+dm.heightPixels+"\t dpi:"+dm.densityDpi);
        System.out.println("Xd:"+getResources().getDimension(R.dimen.xD));//Xd 代表 系统是从哪个文件夹取的值

        float fontPx = getResources().getDimension(R.dimen.font20px);
        System.out.println("font20---->"+fontPx+"px");
log:
    //经过此次Log日志对比  发现  绿色的按钮的和总是在world字左边一点  适配完美
//    07-18 15:54:03.150 21594-21594/com.zone.screenadapter.screenadapter I/System.out: x100---->>66.65997px
//    07-18 16:09:14.569 27882-27882/com.zone.screenadapter.screenadapter I/System.out: width:720    height:1280     dpi:320
//            07-18 16:09:14.569 27882-27882/com.zone.screenadapter.screenadapter I/System.out: Xd:2.0

//            07-18 16:16:06.011 27179-27179/com.zone.screenadapter.screenadapter I/System.out: x100---->99.98996px(参考DPI)
//    07-18 16:16:06.011 27179-27179/com.zone.screenadapter.screenadapter I/System.out: width:1080   height:1920     dpi:480
//            07-18 16:16:06.011 27179-27179/com.zone.screenadapter.screenadapter I/System.out: Xd:3.0

//    07-18 16:18:53.411 26574-26574/com.zone.screenadapter.screenadapter I/System.out: x100---->133.31995px
//    07-18 16:18:53.411 26574-26574/com.zone.screenadapter.screenadapter I/System.out: width:1440   height:2560     dpi:640
//            07-18 16:18:53.411 26574-26574/com.zone.screenadapter.screenadapter I/System.out: Xd:3.0

代码地址:

DP生成
SP生成
测试log所用的Android项目

方案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;

代码地址:

方案二代码

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值