返回
源码视角下的Android View是如何被添加与显示的?
Android
2023-09-16 06:43:09
在 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 的使用技巧,从而编写出更加高效和美观的应用程序。