onResume中是否可以度量宽高?
onResume中度量宽高是否可以?
不确定,需要看onResume在什么时候执行。
viewRootImpl需要在执行了requestLayout()之后才会执行onResume方法;
而没用执行requestLayout()方法的话就不会调用WindowManager的updateViewLayout()方法,就不会继续执行ViewRootImpl中的setLayoutParams、scheduleTraversals、doTraversals以及Session的relayout、WMS中的relayoutWindow方法。没有这套流程的方法就不会有度量控件宽高的执行,因此onResume中获取不到宽高。
onResume方法中通过new Handler().post()可不可以?
不可以。view还没有onMeasure()
setView–》requestLayout–》checkThread–》scheduleTraversals-》
scheduleTraversals中执行了mHandler.getLooper().getQueue().postSyncBarrier();
UI的刷新也是一个个MSG,UI的刷新是在主线程进行,而主线程队列可能堆积过多的MSG;在UI队列中为了保障UI刷新的MSG准时刷新,引入了消息屏障机制
屏障消息没有target。
private int postSyncBarrier(long when){synchronized (this){final int token = mNextBarrierToken++;final Message msg = Message.obtain();msg.markInUse();msg.when = when;msg.argl = token;Message prev = null;Message p = mMessages;if (when != 0){while (p != null && p.when <= when){prev = p;p = p.next;}}if (prev != null){msg.next = p;prev.next = msg;}else {msg.next = p;mMessages = msg;}return token;}
}//no target 优先执行
synchronized(this){Message prevMsg = null;Message msg = mMessage;if(msg != null && msg.target == null){do{prevMsg = msg;msg = msg.next;}while(msg != null && !msg.isAsynchronous());}if(msg != null){//do ......}
}
而new Handler().post()方法在执行时屏障消息还没有执行,还没有执行requestLayout,也还没有执行scheduleTraversals,ui的屏障消息还没有执行,因此UI还没有刷新。
new Handler().postDelayed(,17);应该就能拿到宽高。
线程中view.setText一定会报错吗?
在onCreate中的新建子线程,view.setText()只是将内容存储到了view,都还没有执行addVIew操作更不会有UI刷新操作,因此不会报错,也不会有异常;在onResume中执行也不会出错,同理。如果在其他地方执行,已经进行了UI的刷新操作。如果再次进行子线程设置text的操作,WMS会检测到就会报错。
view的绘制过程都是用的同一个Canvas吗?
vieRootImpl中有preformDraw,在其中调用Draw函数,在该函数中调用drawSoftware函数,在这个函数中会调用canvas = mSurface.lockCanvas(dirty); 再调用mView.draw(canvas),然后再调用view类中的draw。
该draw()函数会先执行drawBackground(canvas)方法,然后执行onDraw(canvas)方法,然后执行dispatchDraw(canvas)将canvas分发给孩子。因此是用的同一个canvas
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KL7qJkqh-1638964830173)(C:\Users\wangshuo\AppData\Roaming\Typora\typora-user-images\image-20211208195831454.png)]
patchDraw(canvas)将canvas分发给孩子。因此是用的同一个canvas
onResume中是否可以度量宽高?相关推荐
- Android源码—为什么onResume方法中不可以获取View宽高
前言 有一个经典的问题,我们在Activity的onCreate中可以获取View的宽高吗?onResume中呢? 对于这类八股问题,只要看过都能很容易得出答案:不能. 紧跟着追问一个,那为什么Vie ...
- Android 在onCreate()方法中获取控件宽高值为0解决方案
大家很多时候需要在Activity或者Fragment的onCreate()方法中获取声明的空间的高度或者宽度,进行位置移动或者其他操作,但是当调用 view.getHeight() 或者 view. ...
- js获取svg中g元素的宽高
这里有一个g元素: <g id="g_main" transform="translate(120,2804.5)"><rect>< ...
- css3中使用calc()计算宽高
calc()是什么? 是CSS3中新增的一个函数,calculate(计算)的缩写.用于动态计算宽/高,你可以使用calc()给元素的各个属性设置值[margin.border.padding.fon ...
- 移动端获取当前屏幕的高度_css中获取屏幕的宽 高
阅读数:26120 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body ...
- 在任意类中获得屏幕的宽高
/** 获取手机的屏幕宽 */ public static int getSW(Context context) {int sw;WindowManager wm = (WindowManager) ...
- Flutter中Contrainer 组件的宽高限制分析
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 头条同步 百度同步 本 ...
- android 自定义控件的宽高_巧用Handler获取View控件信息
众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...
- Android获取View宽高的常见方式
背景 有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetM ...
最新文章
- 2019-10-27 控制领域期刊介绍
- c cuda 指定gpu_《CUDA C编程权威指南》——1.3 用GPU输出Hello World-阿里云开发者社区...
- 使用timer控件创建一个简单的报警程序
- 五、scrapy爬虫框架——logging 模块的使用
- Java线程start()vs run()方法及示例
- 快速卷积与快速相关——MATLAB
- python如何创建模块视频_Python | 如何创建模块(模块示例)?
- Android小知识-了解下Android系统的显示原理
- (31)FPGA原语设计(IBUFG)
- java运算符使用总结_Java运算符知识点总结
- 实验代做 行人识别_《行人跨模态重识别 | 双向限制的排序损失》
- iOS底层探索之多线程(五)—GCD不同队列源码分析
- VCS学习(2)debug simulation mismatches
- 小明上学201812-1
- C++高级进阶 第二季:mutable 关键字
- hping3拒绝服务攻击小结
- pdf文件如何生成目录 wps_利用wps创建有目录的PDF/word
- ESP32-S3 USB UART 下载总结
- Spring AOP原理详解及实例
- 阻塞IO和NIO的区别