getDimension方法的一些坑

(转载)http://luckyandyzhang.github.io/2015/09/25/getDimension%E6%96%B9%E6%B3%95%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/

问题背景

在Android开发中,我们经常会在dimens.xml中定义一些值,比如边距,字体大小等

1
2
3
<resources>
    <dimen name="item_padding">16dpdimen>
resources>

然后我们会在代码中获取该值

1
float itemPadding = getResources().getDimension(R.dimen.item_padding);

你会发现获取到itemPadding的值并不一定是16。
比如我这里获得的值却是32(我所调试的手机屏幕属于xhdpi)

那么这个值究竟是怎么算的呢?我们先来看个表:

dpi 分辨率 倍数
mdpi 160dpi 1X
hdpi 240dpi 1.5X
xhdpi 320dpi 2X
xxhdpi 480dpi 3X
xxxhdpi 640dpi 4X

“我裤子都脱了,你就给我看这个?”
莫慌,答案在下面。

其实getDimension()这个方法会将原有的值以px为单位进行转换,由于我的手机是xhdpi的,转换为px是2倍的关系,最终获得的值就是32

扩展

在自定义View的时候,为了方便开发者可以在xml中设置一些属性,我们通常会在attr.xml声明我们自己的属性

1
2
3
4
5
6

<resources>
    <declare-styleable name="Gauge">
        <attr name="gaugeInnerPadding" format="dimension" />
    declare-styleable>
resources>

然后在代码中获取

1
2
3
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.Gauge, defStyle, 0);
float mGaugeInnerPadding = attributes.getDimension(R.styleable.Gauge_gaugeInnerPadding, 10f);
attributes.recycle();

此时需要注意的是,假如我们在xml中已经设置了gaugeInnerPadding的值(比如12dp),那么根据上面的知识,我们知道,最终获取到的值是转化为px的。但是,如果我们没有在xml中设置gaugeInnerPadding,那么获取到的是默认值10f,是不会转换为px的。这里需要注意一下。

如果我们希望默认值10f也能转换为px,该怎么办呢?
so easy ~

1
mGaugeInnerPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, displayMetrics);

我稍微解释一下。上面那句代码表示的是,将10f当做是以dip为单位的(也就是10dp),然后根据当前屏幕的dpi,将该值转换为以px为单位的。

第一篇博客就这样愉快的结束了…

< 
Android反编译工具

你可能感兴趣的:(Android学习)