您的位置:首页 > 其它

getDimension方法的一些坑

2016-02-16 17:09 218 查看
(转载)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">16dp</dimen>
</resources>

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

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

你会发现获取到
itemPadding
的值并不一定是16。

比如我这里获得的值却是32(我所调试的手机屏幕属于xhdpi)

那么这个值究竟是怎么算的呢?我们先来看个表:
dpi分辨率倍数
mdpi160dpi1X
hdpi240dpi1.5X
xhdpi320dpi2X
xxhdpi480dpi3X
xxxhdpi640dpi4X
“我裤子都脱了,你就给我看这个?”

莫慌,答案在下面。

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


扩展

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

<?xml version="1.0" encoding="utf-8"?>
<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反编译工具
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: