返回

View系列:自定义流程**\<#

Android

<#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的生命周期,为定制化和优化应用程序界面奠定坚实的基础。