Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Android setText() 渲染流程 #8

@zhangsr

Description

@zhangsr

为了清晰,下面用伪代码简化

调用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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions