android的适配问题永远都是个头疼的问题,手机种类繁多,配置差异大,单纯的用dp,实际效果还是有差别的,本文分享下我的适配方法。
如果我们想获得某一宽度值,比如画个圆,获取圆的半径,
通常的做法:
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }
这种方法是通常的做法,也是Android内置组件使用的方法,如TextView中的一段代码:
final float scale = getResources().getDisplayMetrics().density; mPopup = new ErrorPopup(err, (int) (200 * scale + 0.5f),
但是这种方法只考虑到了分辨率,没有考虑像素密度Dpi。这样的话,在相同分辨率下,如果手机的dpi很小,则显示的效果就会偏大。如果dpi很大,效果就会偏小。
另一种方法,其实也是笨方法:
/** * 获得默认圆的半径 */ public int getDefaultCircleRadius(){ if(screenWidth >= 1400){//1440,2k屏幕 return 34; } if(screenWidth >= 1000){//1080 if(densityDpi >=480) return 30; if(densityDpi >= 320) return 31; return 31; } if(screenWidth >= 700){//720 if(densityDpi >= 320) return 18; if(densityDpi >= 240) return 18; if(densityDpi >= 160) return 19; return 18; } if(screenWidth >= 500){//540 if(densityDpi >= 320) return 15; if(densityDpi >= 240) return 16; if(densityDpi >= 160) return 17; return 15; } return 15; }
densityDpi是像素密度。screenWidth是屏幕的宽度,代表分辨率,因为绝大多数手机的比例都是16:9或16:10的,所以高度上相差不大。
该方法就是在相同分辨率下,在根据像素密度区分。优点是适配灵活,可以任意添加适配的手机。缺点是,代码繁琐,另外对于大于2k的分辨率无法进行适配,解决的办法是,与第一种方法相结合:
public int getDefaultCircleRadius(){
if(wcreenWidth > 1440){
return dip2px(context, 30);
}
if(screenWidth >= 1400){//1440
return 30;
}
if(screenWidth >= 1000){//1080
if(densityDpi >=480)
return 30;
if(densityDpi >= 320)
return 30;
return 30;
}
if(screenWidth >= 700){//720
if(densityDpi >= 320)
return 18;
if(densityDpi >= 240)
return 18;
if(densityDpi >= 160)
return 18;
return 18;
}
if(screenWidth >= 500){//540
if(densityDpi >= 320)
return 15;
if(densityDpi >= 240)
return 15;
if(densityDpi >= 160)
return 15;
return 15;
}
return 15;
}
方法虽然优点笨,实际适配时也会增加很大工作量,但是对于精确适配以及全适配问题,还是很有用的。