View的绘制机制
View树的绘制流程
measure -> layout -> draw
measure
- 从View树自上而下进行遍历
- ViewGroup.LayoutParams
MeasureSpec
将LayoutParams根据父容器施加的Mode转换成对应的MeasureSpec,根据MeasureSpec设置View的长宽高
measure-重要方法
- measure()
- onMeasure(),最后调用setMeasureDimension()
- setMeasureDimension()
layout
- 从View树自上而下进行遍历
draw
两个容易混淆的方法
- invalidate():
- requestLayout()
事件分发机制
为什么会有事件分发机制
安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解决这个问题,就有了事件分发机制。
- Phonewindow
- DecorView
三个重要的事件分发方法
- dispatchTouchEvent()
- onInterceptTouchEvent()
- onTouchEvent()
Activity与View没有onInterceptTouchEvent()
事件分发流程
Activity -> PhoneWindow -> DecorView -> ViewGroup -> … ->View
ListView
什么是ListView
ListView就是一个能以数据集合滚动的方式展示到用户界面的View
ListView适配器模式
基于MVC设计模式,Adapter接触正在的数据源。首先调用getCount(),根据长度调用getView()绘制每一个item。
ListView的recycleBin机制
AbsListView中的内部类,当中有三个比较重要的变量:
1. View[] mActiveViews:存储活动的View,即屏幕中可见View,可被复用
2. ArrayList[] mScrapViews:二维数组,存储所有废弃的View,屏幕滑出去的View
3. ArrayList mCurrentScap:当前被滑出去的View
ListView滑动的时候,它会把滑出屏幕的View给删除,不绘制看不见的View,看不见的View都存放在RecycleBin,类似回收站
只有屏幕可见的item是存储在内存当中的,其他的在屏幕外的都保存在RecycleBin中,元素0滑出屏幕时,保存在RecycleBin中,元素6可见时,6保存在内存中,复用元素0的item
ListView优化
- converView(复用View)/ViewHolder(避免FindViewById次数多)
- 三级缓存/监听滑动事件(滑动停止的时候加载数据)
- 避免绘制半透明的元素
- 开启硬件加速