WebView 与 Android View 体系深度对比:绘制、事件与渲染机制
一、概述
虽然 WebView 在类层次上继承自 AbsoluteLayout,但其内部实现与普通 Android View 有着本质区别。它不仅仅是一个容器,更是一个完整的浏览器引擎。本文将从绘制流程、事件处理、渲染机制、线程模型等多个维度,深入剖析两者的差异。
二、继承关系对比
2.1 类层次结构
Android View 层次:
Object └─> View ├─> TextView ├─> ImageView ├─> ViewGroup │ ├─> LinearLayout │ ├─> RelativeLayout │ ├─> FrameLayout │ └─> AbsoluteLayout ◄── WebView 继承这里 └─> SurfaceView
WebView 类定义:
public class WebView extends AbsoluteLayout implements ViewTreeObserver.OnGlobalFocusChangeListener, ViewGroup.OnHierarchyChangeListener, ViewDebug.HierarchyHandler {
// WebView 实现
}
2.2 为什么 WebView 继承 AbsoluteLayout?
这其实是个历史遗留问题。早期 Android 版本中,WebView 需要绝对定位子 View,为了保持 API 稳定性,不能轻易改变继承关系。实际上,WebView 并不使用 AbsoluteLayout 的任何布局功能,几乎所有核心逻辑都代理给了 WebViewProvider。
三、绘制流程对比
3.1 普通 View 绘制流程
ViewRootImpl.performTraversals() │ ├─> measure (测量) │ └─> View.onMeasure() │ └─> setMeasuredDimension(width, height) │ ├─> layout (布局) │ └─> View.onLayout() │ └─> setFrame(l, t, r, b) │ └─> draw (绘制) └─> View.onDraw(Canvas) ├─> drawBackground() ├─> onDraw() [自定义绘制] ├─> dispatchDraw() [绘制子 View] └─> drawForeground()
关键点:
- 在 UI 线程同步执行
- 使用 Skia Canvas API 绘制
- 绘制结果直接写入 Surface

