看之前希望先看:
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
代码地址:
方案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;