getDimension()\getDimensionPixelSize()\getDimensionPixelOffset()不同

在写自定义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)。

测试代码:

  
    16dp  
    16px  
    16sp  
  
作者:亦枫
链接: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);  
    }  

你可能感兴趣的:(getDimension()\getDimensionPixelSize()\getDimensionPixelOffset()不同)