1.getDimension()是基於當前DisplayMetrics的density進行轉換,獲取指定資源id對應的尺寸。文檔裏並沒說這裏返回的就是像素,要注意這個函數的返回值是float,像素肯定是int。
2.getDimensionPixelSize()與getDimension()功能類似,不同的是將結果轉換爲int,並且小數部分四捨五入。
3.getDimensionPixelOffset()與getDimension()功能類似,不同的是將結果轉換爲int,並且偏移轉換(offset conversion,函數命名中的offset是這個意思)是直接截斷小數位,即取整(其實就是把float強制轉化爲int,注意不是四捨五入哦)。
<dimen name="dp_01">16dp</dimen>
<dimen name="px_01">16px</dimen>
<dimen name="sp_01">16sp</dimen>
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", "density= " + getResources().getDisplayMetrics().density);
Log.d("test", "scaledDensity= " + getResources().getDisplayMetrics().scaledDensity);
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);
有此可見這三個方法都是根據density將其他單位的數值轉換成px的,getDimension返回的是單位是px的float,不對值進行任何處理, getDimensionPixelSize是將結果進行四捨五入,getDimensionPixelOffset是將結果直接截斷小數位。
控件裏面從xml中獲取的dimens的大小都是通過getDimensionPixelSize來轉換成px爲單位的