一、前言:
比如layoutParams、measuredHeight等等为什么单位是px,按理说应该统一用dp更合理啊,毕竟不同设备的px意义差别太大了。
主要是Canvas的问题:
1、dp和px实际上存在转换比,这个跟屏幕实际尺寸、分辨率的像素密度有关。
2、Android在使用Java构建代码时,实际View底层绘制大部分依赖Canvas,而Canvas是以px为单位的。
3、统一是有好处的,但实际上px提供了真正在屏幕上点对点的尺寸单位,而dp并一定能精确到每个像素点,就好比列表常用的分割线举例,一般的设计稿都是1px而不是dp,因为此时的dp无法量化一个非常细的分割线。
4、Java代码中并不支持自定义的 “单位” 因此无法像XML中随意选择px还是dp,只能使用最精确的单位,即px。
5、实际上XML中设置的值也会在从AttributeSet中取出时被转换为精确值(px)然后在onDraw中绘制在屏幕上的,这个转换过程一般是由Attr代劳。
/**
* 根据手机的分辨率从 dip 的单位 转成为 px(像素)
*/
public static int dip2px(Context context,float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale +0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context,float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale +0.5f);
}
网友评论