返回

源码视角下的Android View是如何被添加与显示的?

Android

在 Android 开发中,View 是用户界面(UI)的基础组件。它们负责显示内容、收集用户输入并处理用户交互。为了充分理解 View 的工作原理,我们不妨透过源码的视角,探究它们是如何被添加与显示的。

添加View

当我们想要在屏幕上显示一个 View 时,需要将其添加到父视图中。这个过程通常通过调用父视图的 addView() 方法来实现。addView() 方法有两个参数:要添加的 View 和一个用于指定 View 在父视图中位置的LayoutParams 对象。

public void addView(View child, LayoutParams params) {
    // 省略部分代码
    addViewInner(child, -1, params, true);
    // 省略部分代码
}

addView() 方法首先会调用 addViewInner() 方法,将子视图添加到父视图的子视图列表中。然后,它会调用 requestLayout() 方法,请求父视图重新计算子视图的布局。最后,它会调用 invalidate() 方法,请求父视图重新绘制自己和子视图。

显示View

当父视图的布局发生变化时,onLayout() 方法就会被调用。在这个方法中,父视图负责计算子视图的位置和大小。然后,父视图会调用 onDraw() 方法,在这个方法中,父视图会绘制自己和子视图。

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    // 省略部分代码
    for (int i = 0; i < mChildrenCount; i++) {
        View child = mChildren[i];
        if (child.getVisibility() != GONE) {
            // 省略部分代码
            final View childWithMargins = getChildWithMargins(child);
            int childLeft;
            int childTop;
            childLeft = childWithMargins.mLeft;
            childTop = childWithMargins.mTop;
            child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(), childTop + child.getMeasuredHeight());
        }
    }
    // 省略部分代码
}

protected void onDraw(Canvas canvas) {
    // 省略部分代码
    for (int i = 0; i < mChildrenCount; i++) {
        final View child = mChildren[i];
        if (child.getVisibility() != GONE) {
            // 省略部分代码
            drawChild(canvas, child, getDrawingTime());
        }
    }
    // 省略部分代码
}

总结

通过阅读源码,我们了解到 View 是如何被添加到父视图中并显示出来的。这个过程主要涉及 addView(), onLayout()onDraw() 三个方法。通过理解这些方法的工作原理,我们可以更好地掌握 View 的使用技巧,从而编写出更加高效和美观的应用程序。