大家知道,在Android代码中获取res资源dimens.xml
文件中定义的尺寸大小,可以通过如下三个方法:
- getDimension
- getDimensionPixelOffset
- getDimensionPixelSize
他们的相同点和区别是:
-
getDimension和getDimensionPixelOffset功能类似,唯一区别就是返回类型不一样,前者返回类型为int类型,后者为float类型;
-
如果resources中dimen属性值的单位是dp或者sp,三者都需要将其乘以density,然后返回对应px值;
-
如果单位是px,getDimension和getDimensionPixelOffset返回原值,而getDimensionPixelSize仍需乘以density;
比如,在dimens.xml
资源文件中定义如下测试尺寸:
<resources>
<dimen name="dp_01">16dp</dimen>
<dimen name="px_01">16px</dimen>
<dimen name="sp_01">16sp</dimen>
</resources>
测试代码:
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);
测试结果:
//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
了解了上述区别后,再来看看在代码中设置TextSize的问题。
setTextSize(float size)的默认大小单位是sp,所以通过该方法设置的文本大小和在布局中通过android:textSize
属性设置的文本大小不一致,所以需要用到设置文本大小的另一个方法,指定单位:
setTextSize(int unit, float size)
其中,第一个参数的可选单位值为:
- TypedValue.COMPLEX_UNIT_PX : Pixels
- TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
- TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels
可以根据在资源中定义的不同尺寸选择合适的单位格式,这样,就能在代码中设置和布局中相同大小的文本。
关注微信公众号,第一时间获取技术资讯!
微信公众号【技术鸟】_二维码.gif
网友评论
他们的相同点和区别是:
getDimension和getDimensionPixelOffset功能类似,唯一区别就是返回类型不一样,前者返回类型为int类型,后者为float类型;写反了。
public float getDimension(@DimenRes int id) throws NotFoundException {},
public int getDimensionPixelOffset(@DimenRes int id) throws NotFoundException {}