View的绘制机制

View树的绘制流程

measure -> layout -> draw

measure

  1. 从View树自上而下进行遍历
  2. ViewGroup.LayoutParams
  3. MeasureSpec

    将LayoutParams根据父容器施加的Mode转换成对应的MeasureSpec,根据MeasureSpec设置View的长宽高

measure-重要方法

  1. measure()
  2. onMeasure(),最后调用setMeasureDimension()
  3. setMeasureDimension()

layout

  1. 从View树自上而下进行遍历

draw

两个容易混淆的方法

  1. invalidate():
  2. requestLayout()

Android面试__View相关

事件分发机制

为什么会有事件分发机制

安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解决这个问题,就有了事件分发机制。

  1. Phonewindow
  2. DecorView

三个重要的事件分发方法

  1. dispatchTouchEvent()
  2. onInterceptTouchEvent()
  3. 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,类似回收站

Android面试__View相关

只有屏幕可见的item是存储在内存当中的,其他的在屏幕外的都保存在RecycleBin中,元素0滑出屏幕时,保存在RecycleBin中,元素6可见时,6保存在内存中,复用元素0的item

ListView优化

  • converView(复用View)/ViewHolder(避免FindViewById次数多)
  • 三级缓存/监听滑动事件(滑动停止的时候加载数据)
  • 避免绘制半透明的元素
  • 开启硬件加速

相关文章:

  • 2022-12-23
  • 2022-02-03
  • 2021-05-08
  • 2021-06-21
猜你喜欢
  • 2021-12-03
  • 2021-07-30
  • 2021-04-18
  • 2021-07-19
  • 2021-11-28
  • 2021-11-19
相关资源
相似解决方案