【android】使用getDimension().toInt()的一点点坑
在改UI时发现之前的代码的问题。
问题描述
代码中使用getDimension
获取margin,然后用MarginLayoutParamsCompat.setMargin(lp, margin.toInt())
设置margin,导致该控件显示的像素在不同机型上可能与xml文件中其他控件有2px的差距。
原因分析:
参考:【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
在自定义控件中使用自定义属性时,经常需要使用java代码获取在xml中定义的尺寸,相关有以下三个函数
- getDimension()
- getDimensionPixelOffset()
- getDimensionPixelSize()
(在类TypedArray和类Resources中都有这三个函数,功能类似,TypedArray中的函数是获取自定义属性的,Resources中的函数是获取android预置属性的)
- getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。
- getDimensionPixelSize()与getDimension()功能类似,不同的是将结果转换为int,并且小数部分四舍五入。
- getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名中的offset是这个意思)是直接截断小数位,即取整(其实就是把float强制转化为int,注意不是四舍五入哦)。
解决方案:
很简单的哦
因为toInt()
是直接截断小数位,先getDimension
再toInt()
相当于getDimensionPixelOffset()
,不准确。
直接用getDimensionPixelSize()
即可。