Hello,CSDN。第一篇博客就写点关于Android的一本书的吧。

文章讨论了在Android开发中自定义控件时遇到的挑战,特别是测量过程,建议避免轻易继承ViewGroup。作者提到了书籍《Android自定义控件高级进阶与精彩实例》,并强调了Lottie动画库对工作的重要性。在测量方面,重点解释了MeasureSpec的模式,如AT_MOST和EXACTLY,并提醒开发者在AdapterView中要考虑UNSPECIFIED情况。
摘要由CSDN通过智能技术生成

第一篇博客,不知道写点啥,对于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。

谢谢阅读。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值