第一篇博客,不知道写点啥,对于android。
最近看了 如何自定义动画的书 -- 启舰的《Android自定义控件高级进阶与精彩实例》。感想如下:
1,自定义控件写的还是少。每次写都像是在抓瞎,特别是测量那。总结就是,不要装逼去继承ViewGroup,忠告!
2,嗯。。书挺贵。
对于这本书最后介绍的动画框架Lottie,对于日后的工作帮助很大。感谢🙏。
说说测量:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
measureChildren(widthMeasureSpec,heightMeasureSpec)// 1 测量子控件
var height = getSelfHeigth()
var maxWidth = getWidthMax()
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST){
setMeasuredDimension(maxWidth,height)
} else if(widthMode == MeasureSpec.AT_MOST){
setMeasuredDimension(maxWidth,heightSize)
} else if (heightMode == MeasureSpec.AT_MOST){// ***
setMeasuredDimension(widthSize,height)
} else {
setMeasuredDimension(widthSize,heightSize)
}
}
就这段代码来说,如果继承的是ViewGroup,super.onMeasure没啥意义,那么优先测量子控件就成了必操作项。下面那一堆mode,size之类的 几乎就是样板代码。最后调用setMeasuredDimension()完成测量。
MeasureSpec类,AT_MOST 没啥说的,就是对应着xml里的wrap_content,表示父控件更给到的最大size。EXACTLY,对应具体数值或者Match_parent。常用的也就这两种。UNSPECIFIED 书中说了一般是系统才会用到,什么时候用到没说,我没看到,我眼瞎。看了一些其他博主的文章说是AdaperView测量的时候用到。在开发工作中,的确遇到过,上面代码 ***处,我明明指定了AT_MOST但是断点反应的却是UNSPECIFIED。所以,如果开发的控件多半用在Adapter中的时候,一定要考虑UNSPECIFIED。
谢谢阅读。