-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
为了清晰,下面用伪代码简化
调用textView.setText(),首先会经过几层简单的封装,方法名都是setText()
// TextView.java
setText() {
notifyListeners();
checkForRelayout();
}首先通知到文本改变的监听器,如TextChangedListener()
// TextView.java
checkForRelayout() {
......
if (needReLayout) {
requestLayout(); //重新布局
}
invalidate(); //即调用onDraw()重新绘制
}检查是否需要改变布局,如果需要,则在重绘之前会调用requestLayout()
// TextView.java
onDraw() {
drawBackground();
drawIcon();
drawShadow();
......
layout.draw();
}针对整个TextView的范围,绘制好文字以外或者底部的各种部件
// Layout.java
draw() {
drawBackground(); //绘制段落的背景
drawText();
}针对文字段落,绘制背景,然后终于轮到了主角
// Layout.java
drawText() {
...... // 计算渲染的位置坐标
for (每一行) {
if (!mSpannedText) {
// 普通无样式文本
canvas.drawText()
} else {
// TODO
}
}
}针对每一行文字,逐行进行绘制
// Canvas.java
drawText() {
native_drawText(canvas, paint, x, y, ...);
}调用native渲染方法,并提供必须的参数:画布、画笔(包括各个属性,大小、粗细、颜色等)、坐标。
这就是TextView setTextView渲染的主要流程,给出个大概框架之后,可以供后面深入优化参考。
Metadata
Metadata
Assignees
Labels
No labels