getDimension()、getDimensionPixelSize()和getDimensionPixelOffset()的区别

 

在Android代码中获取res资源dimens.xml文件中定义的尺寸大小,可以通过如下三个方法:

       • getDimension

       •getDimensionPixelOffset

       •getDimensionPixelSize

在资源中的定义:


<dimen name="dp_20">20dpdimen>
<dimen name="sp_20">20spdimen>
<dimen name="dp_20_4">20.4dpdimen>
<dimen name="dp_20_5">20.5dpdimen>
<dimen name="px_20">20pxdimen>
<dimen name="px_20_4">20.4pxdimen>
<dimen name="px_20_5">20.5pxdimen>

测试主要代码为,我的真机density为3:

Log.d(TAG,  "--------获取的dimens.xml中的值为20dp的情况-------------");
Log.d(TAG, "getDimension:"+getResources().getDimension(R.dimen.dp_20) + "");
Log.d(TAG, "getDimensionPixelSize:"+getResources().getDimensionPixelSize(R.dimen.dp_20) + "");
Log.d(TAG, "getDimensionPixelOffset:"+getResources().getDimensionPixelOffset(R.dimen.dp_20) + "");
Log.d(TAG,  "--------获取的dimens.xml中的值为20sp的情况-------------");
Log.d(TAG, "getDimension:"+getResources().getDimension(R.dimen.sp_20) + "");
Log.d(TAG, "getDimensionPixelOffset:"+getResources().getDimensionPixelOffset(R.dimen.sp_20) + "");
Log.d(TAG, "getDimensionPixelSize:"+getResources().getDimensionPixelSize(R.dimen.sp_20) + "");
Log.d(TAG,  "--------获取的dimens.xml中的值为20.4dp的情况-------------");
Log.d(TAG, "getDimension:"+getResources().getDimension(R.dimen.dp_20_4) + "");
Log.d(TAG, "getDimensionPixelOffset:"+getResources().getDimensionPixelOffset(R.dimen.dp_20_4) + "");
Log.d(TAG, "getDimensionPixelSize:"+getResources().getDimensionPixelSize(R.dimen.dp_20_4) + "");
Log.d(TAG,  "--------获取的dimens.xml中的值为20.5dp的情况-------------");
Log.d(TAG, "getDimension:"+getResources().getDimension(R.dimen.dp_20_5) + "");
Log.d(TAG, "getDimensionPixelOffset:"+getResources().getDimensionPixelOffset(R.dimen.dp_20_5) + "");
Log.d(TAG, "getDimensionPixelSize:"+getResources().getDimensionPixelSize(R.dimen.dp_20_5) + "");
Log.d(TAG,  "--------获取的dimens.xml中的值为20.4px的情况-------------");
Log.d(TAG, "getDimension:"+getResources().getDimension(R.dimen.px_20_4) + "");
Log.d(TAG, "getDimensionPixelOffset:"+getResources().getDimensionPixelOffset(R.dimen.px_20_4) + "");
Log.d(TAG, "getDimensionPixelSize:"+getResources().getDimensionPixelSize(R.dimen.px_20_4) + "");
Log.d(TAG,  "--------获取的dimens.xml中的值为20.5px的情况-------------");
Log.d(TAG, "getDimension:"+getResources().getDimension(R.dimen.px_20_5) + "");
Log.d(TAG, "getDimensionPixelOffset:"+getResources().getDimensionPixelOffset(R.dimen.px_20_5) + "");
Log.d(TAG, "getDimensionPixelSize:"+getResources().getDimensionPixelSize(R.dimen.px_20_5) + "");

打印的结果为:

04-13 14:57:42.047  D/MainActivity: --------获取的dimens.xml中的值为20dp的情况-------------
04-13 14:57:42.047  D/MainActivity: getDimension:60.0
04-13 14:57:42.047  D/MainActivity: getDimensionPixelSize:60
04-13 14:57:42.047  D/MainActivity: getDimensionPixelOffset:60
04-13 14:57:42.047  D/MainActivity: --------获取的dimens.xml中的值为20sp的情况-------------
04-13 14:57:42.047  D/MainActivity: getDimension:60.0
04-13 14:57:42.047  D/MainActivity: getDimensionPixelOffset:60
04-13 14:57:42.047  D/MainActivity: getDimensionPixelSize:60
04-13 14:57:42.047  D/MainActivity: --------获取的dimens.xml中的值为20.4dp的情况-------------
04-13 14:57:42.047  D/MainActivity: getDimension:61.19998
04-13 14:57:42.047  D/MainActivity: getDimensionPixelOffset:61
04-13 14:57:42.048  D/MainActivity: getDimensionPixelSize:61
04-13 14:57:42.048  D/MainActivity: --------获取的dimens.xml中的值为20.5dp的情况-------------
04-13 14:57:42.048  D/MainActivity: getDimension:61.5
04-13 14:57:42.048  D/MainActivity: getDimensionPixelOffset:61
04-13 14:57:42.048  D/MainActivity: getDimensionPixelSize:62
04-13 14:57:42.048  D/MainActivity: --------获取的dimens.xml中的值为20.4px的情况-------------
04-13 14:57:42.048  D/MainActivity: getDimension:20.399994
04-13 14:57:42.048  D/MainActivity: getDimensionPixelOffset:20
04-13 14:57:42.048  D/MainActivity: getDimensionPixelSize:20
04-13 14:57:42.048  D/MainActivity: --------获取的dimens.xml中的值为20.5px的情况-------------
04-13 14:57:42.048  D/MainActivity: getDimension:20.5
04-13 14:57:42.048  D/MainActivity: getDimensionPixelOffset:20
04-13 14:57:42.048  D/MainActivity: getDimensionPixelSize:21


根据以上测试结果得出结论:

1.getDimension返回值为float型,getDimensionPixelOffset、getDimensionPixelSize为整型

2.如果resources中dimen属性值的单位是dp或者sp,那么方法的返回值都为 :属性值*density,然后根据第4条不同的方法对(属性值*density)做了不同的处理;

3..如果resources中dimen属性值的单位是px的时候,那么方法的返回值都为:属性值,不需要再乘以density,然后根据第4条不同的方法对属性值做了不同的处理;

4.,getDimension返回值为准确值,getDimensionPixelOffset返回值为直接舍去小数位的整数,getDimensionPixelSize为四舍五入的整数;

你可能感兴趣的:(getDimension()、getDimensionPixelSize()和getDimensionPixelOffset()的区别)