在写自定义View的时候想获取dimen值的时候,有下面三个函数:
- (float) getDimension(int index, float defValue)
- (int) getDimensionPixelSize(int index, int defValue)
- (int) getDimensionPixelOffset(int index, int defValue)
看看API reference里的解释:
- getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。
- getDimensionPixelSize()与getDimension()功能类似,不同的是将结果转换为int,并且小数部分四舍五入。
- getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名中的offset是这个意思)是直接截断小数位,即取整(其实就是把float强制转化为int)。
测试代码:
<resources>
<dimen name="dp_01">16dp</dimen>
<dimen name="px_01">16px</dimen>
<dimen name="sp_01">16sp</dimen>
</resources>
作者:亦枫
链接:http://www.jianshu.com/p/9cdfc2f26a52
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
float a1=getResources().getDimension(R.dimen.dp_01);
int a2=getResources().getDimensionPixelOffset(R.dimen.dp_01);
int a3=getResources().getDimensionPixelSize(R.dimen.dp_01);
float b1=getResources().getDimension(R.dimen.px_01);
int b2=getResources().getDimensionPixelOffset(R.dimen.px_01);
int b3=getResources().getDimensionPixelSize(R.dimen.px_01);
float c1=getResources().getDimension(R.dimen.sp_01);
int c2=getResources().getDimensionPixelOffset(R.dimen.sp_01);
int c3=getResources().getDimensionPixelSize(R.dimen.sp_01);
Log.d("test", "getDimension= "+a1+", getDimensionPixelOffset="+a2+",getDimensionPixelSize="+a3);
Log.d("test", "getDimension= "+b1+", getDimensionPixelOffset="+b2+",getDimensionPixelSize="+b3);
Log.d("test", "getDimension= "+c1+", getDimensionPixelOffset="+c2+",getDimensionPixelSize="+c3);
作者:亦枫
链接:http://www.jianshu.com/p/9cdfc2f26a52
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
测试结果:
//Device (480*800,240dpi,density=1.5):
getDimension= 24.0, getDimensionPixelOffset=24,getDimensionPixelSize=24
getDimension= 16.0, getDimensionPixelOffset=16,getDimensionPixelSize=24
getDimension= 24.0, getDimensionPixelOffset=24,getDimensionPixelSize=24
作者:亦枫
链接:http://www.jianshu.com/p/9cdfc2f26a52
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
补充:
当利用上述的getDimension() 获取到数据后,如果用TextView/EditText.setTextSize()时需注意:
- setTextSize(float size) {
setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}
即默认是使用sp数据,它和px之间涉及到转化。 - setTextSize(int unit, float size)
其中 unit = {TypedValue.COMPLEX_UNIT_SP,TypedValue.COMPLEX_UNIT_PX,TypedValue.COMPLEX_UNIT_DIP};
/**
* 根据手机的分辨率从 dp 的单位 转成为 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);
}
网友评论