为了账号安全,请及时绑定邮箱和手机立即绑定

TextView源码分析

标签:
Java

1 绘制材料的准备

画布(绘制过程)  +   输入(接受用户交互)
Activity窗口的组成是:PhoneWindow对象,一个DecorView对象,以及一个ViewRoot对象;

  • PhoneWindow对象用来描述窗口对象,本身也是一个View

  • DecorView对象用来描述窗口的顶层视图(装填子View)

  • ViewRoot对象除了用来与WindowManagerService服务通信之外,还用来接收用户输入。


    webp

    image

2 TextView的绘制过程

  1. 测量(Measure): 告诉父视图自己的所占据的空间的大小

  2. 布局(Layout): 控件的位置

  3. 绘制(Draw):
     Java层的Canvas实际上是封装了C++层的SkCanvas。C++层的SkCanvas内部有一块图形缓冲区,这块图形缓冲区就是窗口的绘图表面(Surface)里面的那块图形缓冲区。
     窗口的绘图表面里面的那块图形缓冲区实际上是一块匿名共享内存,它是SurfaceFlinger服务负责创建的。
    http://blog.csdn.net/luoshengyang/article/details/7846923
     SurfaceFlinger服务创建完成这块匿名共享内存之后,就会将其返回给窗口所运行在的进程。窗口所运行在的进程获得了这块匿名共享内存之后,就会映射到自己的进程空间来,因此,窗口的控件就可以在本进程内访问这块匿名共享内存了,实际上就是往这块匿名共享内存填入UI数据。注意,这个过程执行完成之后,控件的UI还没有反映到屏幕上来,因为这时候将控件的UI数据填入到图形缓冲区而已。
    http://blog.csdn.net/luoshengyang/article/details/8462738
    窗口的UI的显示是WindowManagerService服务来控制的。因此,当窗口的所有控件都绘制完成自己的UI之后,窗口就会向WindowManagerService服务发送一个Binder进程间程通信请求。WindowManagerService服务接收到这个Binder进程间程通信请求之后,就会请求SurfaceFlinger服务刷新相应的窗口的UI。

3 TextView的获取键盘输入过程

http://blog.csdn.net/luoshengyang/article/details/6882903
每一个窗口的创建的时候,都会与系统的输入管理器建立一个用户输入接收通道。输入管理器在启动两个线程,其中一个用来监控用户输入,即监控用户是否按下或者放开了键盘按键,或者是否触摸了屏幕,另外一个用来将监控到的用户输入事件分发给当前激活的窗口来处理,而这个分发过程就是通过前面建立的通道来进行的.
ViewRoot类的成员函数deliverKeyEvent负责分发键盘输入事件,而ViewRoot类的成员函数deliverPointerEvent负责分发触摸屏输入事件

webp

image



作者:秋阳君
链接:https://www.jianshu.com/p/489b6433cf1c



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消