android 自定义控件onmesure获取宽度为0

最近项目需要适配8.0版本,自定义控件出现了下面的问题


图片.png

第一次显示此弹窗字体出现了偏移,找到原因是textpaint在绘制文字的时候

canvas.drawText(itemText, x + (controlWidth / 2) -textRect.width()/2, height,
textPaint);

其中controlwidth宽度也就是控件宽度为0.

发现在控件onmesure时 getwidth()方法获取到宽度为0. 一番排查发现,自定义控件在onmesure时,父控件并没有绘制完毕,导致
自定义控件宽度为0(不知道是不是8.0有什么改动),然后做了如下修改

llCover.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
        llCover.getViewTreeObserver()
              .removeGlobalOnLayoutListener(this);
     pick_province.requestLayout();
     pick_city.requestLayout();
     pick_district.requestLayout();
     }

监听父控件绘制情况,绘制完毕之后重新再绘制一边自定义控件,这下可以获取到宽度了。完美解决问题


图片.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容