一.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布局.

2498

被折叠的 条评论
为什么被折叠?



