您的位置:首页 > 移动开发 > Android开发

android之getDimension、getDimensionPixelSize、getDimensionPixelOffset区别

2015-12-18 12:24 465 查看
大家都知道这三个方法都是返回dimen xml配好的像素值,它们之间有什么区别呢?

且看代码:(不用太详细看是怎么回事,只要对比它们之间的区别)

public float getDimension(int id) throws NotFoundException {
synchronized (mTmpValue) {
TypedValue value = mTmpValue;
getValue(id, value, true);
if (value.type == TypedValue.TYPE_DIMENSION) {
return TypedValue.complexToDimension(value.data, mMetrics);
}
throw new NotFoundException(
"Resource ID #0x" + Integer.toHexString(id) + " type #0x"
+ Integer.toHexString(value.type) + " is not valid");
}
}
public static float complexToDimension(int data, DisplayMetrics metrics)
{
return applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
complexToFloat(data),
metrics);
}
public static float complexToFloat(int complex)
{
return (complex&(TypedValue.COMPLEX_MANTISSA_MASK
<<TypedValue.COMPLEX_MANTISSA_SHIFT))
* RADIX_MULTS[(complex>>TypedValue.COMPLEX_RADIX_SHIFT)
& TypedValue.COMPLEX_RADIX_MASK];
}


可以看它的返回类型完全是float 的,所以,假如有一个1.3dp经2倍的手机得出来的是2.6

public int getDimensionPixelOffset(int id) throws NotFoundException {
synchronized (mTmpValue) {
TypedValue value = mTmpValue;
getValue(id, value, true);
if (value.type == TypedValue.TYPE_DIMENSION) {
return TypedValue.complexToDimensionPixelOffset(
value.data, mMetrics);
}
throw new NotFoundException(
"Resource ID #0x" + Integer.toHexString(id) + " type #0x"
+ Integer.toHexString(value.type) + " is not valid");
}
}
public static int complexToDimensionPixelOffset(int data,
DisplayMetrics metrics)
{
return (int)applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
complexToFloat(data),
metrics);//此处做了取整,舍去小数
}


(int)applyDimension()表示只取整数,小数不要,所以1.3dp经2倍的手机得出来的是2

public int getDimensionPixelSize(int id) throws NotFoundException {
synchronized (mTmpValue) {
TypedValue value = mTmpValue;
getValue(id, value, true);
if (value.type == TypedValue.TYPE_DIMENSION) {
return TypedValue.complexToDimensionPixelSize(
value.data, mMetrics);
}
throw new NotFoundException(
"Resource ID #0x" + Integer.toHexString(id) + " type #0x"
+ Integer.toHexString(value.type) + " is not valid");
}
}
public static int complexToDimensionPixelSize(int data,
DisplayMetrics metrics)
{
final float value = complexToFloat(data);
final float f = applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
value,
metrics);
final int res = (int)(f+0.5f);//此处做了四舍五入
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
}


(int)(f+0.5f);可以看出,它用的是四舍五入的机制,所以1.3dp经2倍的手机得出来的是3

系统是怎么用它们的呢?可以看View的构造函数,像:width,height,padding用的都是四舍五入的方式,scrollX,scrollY,translationX,用的是取整.一些系数如:Factor之类的,用的是取float也就是getDimension

如果大家在用布局的时候,用错了会导致多了一条线之类的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android xml 编辑器 dimen