View的工作原理一(基础知识点)

一.Android中关于View的一些知识点:

1.View类:

在Android中View充当着很重要的作用,是Activity中和用户交互所不可或缺的控件,我们先看一下View这个类.

 View:

@UiThread
public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
    private static final boolean DBG = false;
// 其他代码
} 
我们可以清楚的看到就是,这个View类实现了 Drawable.Callback接口和keyEvent的callBack接口,Drawable后面会异步的学习,

还有一个接口就是AccessibilityEventSource;

  Accessibility是Android从API 4开始提供的一个功能,它主要目的是帮助一些因为有视觉,听觉,身体障碍而无法完全使用触摸屏或铃声等的用户来使用Android的。而实际上现在很多开发者都用它来实现一些其他功能了,比如说微信抢红包,自动安装APK,强制停止应用等。

2.常见控件的的继承关系

   我们先看看Android中的Api是怎说说明的:


上网搜的照片,更加的直白:


    我们需要明白的就是: View的直接子类中我们常见的控件是:ImageView ; ProgressBar ;  SurfaceView(播放视频的控件)

还有就是我们最常见的TextView; ViewStub(在Android性能优化的那一片我们说到过,按需加载);   最最重要的就是ViewGroup也是直接继承自View ; ViewGroup可以是一个理解为容器的控件,常见的五大布局都是继承ViewGroup的.

   Button和EditText是继承TextView的; RadioButton和CheckBox是间接继承Button的. 

3.ViewRoot和DecoreView(我就是和Android中的线程池中配置的核心线程来记忆的)

 首先是ViewRoot:对应于ViewRootImpl

@SuppressWarnings({"EmptyCatchBlock", "PointlessBooleanExpression"})
public final class ViewRootImpl implements ViewParent,
        View.AttachInfo.Callbacks, ThreadedRenderer.HardwareDrawCallbacks {
    private static final String TAG = "ViewRootImpl";
//其他代码:

} 
作用: 他是连接DecoreView和WindowManger的纽带.

 View的绘制流程是ViewRoot的performTraversals()方法开始的;进过View的测量,布局,和绘制,最后展示View到屏幕上.

完成了View的测量,布局和绘制三个过程才绘制View展示在屏幕上.

private void performTraversals() {
    // cache mView since it is used so much below...
    final View host = mView;
//其他代码    
} 
具体的执行顺序:

  首先是preformTraversala会依次调用performMeasure()和performLayout()和performDraw()方法:

我们看到在performMeasure()中mView会调用measure()方法


//这是PerformMeasure()方法
private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) {
    Trace.traceBegin(Trace.TRACE_TAG_VIEW, "measure");
    try {
        mView.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_VIEW);
    }
}

下面是performLayout(),我们可以看到是一个host调用了layout()方法;而这个host就是一个View类型.

private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth,
        int desiredWindowHeight) {
    mLayoutRequested = false;
    mScrollMayChange = true;
    mInLayout = true;

    final View host = mView;
    if (DEBUG_ORIENTATION || DEBUG_LAYOUT) {
        Log.v(mTag, "Laying out " + host + " to (" +
                host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
    }

    Trace.traceBegin(Trace.TRACE_TAG_VIEW, "layout");
    try {
        host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
//其他代码......
} 
我们在看看PerformDraw()

private void performDraw() {
    if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) {
        return;
    }

    final boolean fullRedrawNeeded = mFullRedrawNeeded;
    mFullRedrawNeeded = false;

    mIsDrawing = true;
    Trace.traceBegin(Trace.TRACE_TAG_VIEW, "draw");
    try {
        draw(fullRedrawNeeded);
    } finally {
        mIsDrawing = false;
        Trace.traceEnd(Trace.TRACE_TAG_VIEW);
    }
//其他代码
}

同理,也是调用了draw()方法.并且会在里面调用onDraw()方法:

3.View的绘制流程:

第一: 绘制背景 background.draw(canvas)

第二步: 绘制自己 (onDraw())

第三步:绘制孩子(dispatchDraw())

第四步:绘制装饰:(onDrawScrollbars)

 注意: View的绘制流程的传递是通过dispatchDraw()来实现的,他会遍历调用所用子view的draw()方法,是的draw事件一层一层传递下去.

4.DecoreView(顶层view)

在事件分发机制中我们说过,一个事件序列的传递通过activity到windowphone再到Decoreview;

实质是Decoreview是一个FrameLayout类型,里面的是一个线性布局;这个线性布局包括一个tittle和一个actionbar和我们setContentView(R.layout....xml)

下面才是展示的是我们设置的activity的xml布局.






 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值