返回
View系列:自定义流程**\<#
Android
2023-11-17 09:45:05
<#title>View系列:自定义流程 <#/title>**
**
**
从handleResumeActivity开始
自定义流程从handleResumeActivity方法开始,该方法负责将DecorView添加到ViewRootImpl中。DecorView是Activity窗口的根视图,它包含了整个Activity的界面布局。
@Override
public void handleResumeActivity(Activity activity, boolean withResult,
boolean isForward, boolean killProcess) {
View decor = mWindow.getDecorView();
if (decor == null) {
throw new IllegalStateException("Window must have a DecorView");
}
if (mAdded) {
return;
}
// 省略其他代码
}
添加DecorView到ViewRootImpl
将DecorView添加到ViewRootImpl后,会调用ViewRootImpl#req方法,触发invalidate操作。
@Override
public void addView(View view, ViewGroup.LayoutParams params) {
// 省略其他代码
if (mView != null) {
removeView(mView);
}
mView = view;
mView.setLayoutParams(params);
if (!mAdded) {
requestLayout();
}
}
invalidate与drawing
invalidate操作会将View标记为需要重绘,并将其添加到需要重绘的视图列表中。当系统准备绘制视图时,会调用View#draw方法,该方法负责绘制视图的内容。
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// 省略其他代码
}
invalidateChild和dispatchInvalidate
invalidateChild方法用于标记子视图需要重绘,而dispatchInvalidate方法用于将invalidate操作分发给所有子视图。
@Override
public void invalidateChild(View child, Rect dirty) {
// 省略其他代码
}
@Override
public void dispatchInvalidate(Rect invalidatedRect) {
// 省略其他代码
}
invalidateRect
invalidateRect方法用于标记指定区域需要重绘。
@Override
public void invalidateRect(Rect dirty) {
// 省略其他代码
}
Canvas
Canvas类提供了绘图操作的API,例如绘制线、矩形和文本。
public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
// 省略其他代码
}
AnimationController
AnimationController类用于管理动画。
public AnimationController() {
// 省略其他代码
}
通过理解这些关键概念,我们可以深入了解自定义流程中View的生命周期,为定制化和优化应用程序界面奠定坚实的基础。