View框架的消息派发过程及绘制原理详述

本文详细解析了Android系统的视图消息处理流程,包括按键消息和触摸消息的派发机制,以及视图的绘制过程。从viewroot的inputhandler方法开始,到装饰视图(DecorView)的dispatchKeyEvent,再到Activity的交互,最后到视图树的递归调用,全面覆盖了消息处理的各个环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

view的消息派发:

按键消息:wms首选处理home键等系统级信息,底层回调viewroot中的inputhandler的方法,然后调用viewroot的dilverkeyevent(),该函数中首先在输入法之前可以拦截处理消息,然后派发给输入法窗口(前提是输入法窗口存在),之后就派发给应用根试图了(应用的根视图是phonewindow的decorview,非应用窗口的根试图是viewgroup的实现),如果消息未处理则判断是否会引起焦点变化,到此按键消息处理完成,然后如果WMS要求则返回执行结果。

根试图内部(Decorview的dispatchkeyevent()):首先处理物理按键,然后派发到activity。

activity中:回调onUserInteraction,然后回调decorview的dispatchkeyevent。

view树和activity中都没处理,则交给phonewindow处理。

触摸消息:viewroot派发到根视图即decor,然后如果callback不为空,则调用activity的dispatchtouchevent,该方法会调用window的dispatchevent,然后调用decor父类即viewgroup的dispatchtouchevent,之后往下递归调用。如果callback为空则直接调用decor父类即viewgroup的dispatchtouchevent,然后递归调用。最上层view的dispatchtouchevent首先调用ontouchlinsiner的ontouch,然后调用view的ontouchevent,没有消耗则 返回false,上一层的ontouchevent中处理。view树中都没处理则在window中处理屏幕偏移。

绘制:

view树重新遍历原因:视图本身变化,视图内部添加删除。

view的遍历过程:

performTraversals()中的onmeasure、ondraw、onlayout函数。

ondraw绘制内容:view背景,视图本身内容,渐变边框,滚动条。

onmeasure:

onlayout

动画:布局动画在drawchild中完成、视图动画在dispatchdraw中完成。

surface是一个平面内部包含平面大小位置和屏幕内存缓冲区,应用程序可以通过surfaceview创建,canvas和paint是绘制功能类,paint设置文字的颜色大小,构造canvas对象必须指定一段内存,因为绘制的结果就是在内存中填充不同颜色值 。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值