Android面试__View相关

本文详细介绍了Android中View的绘制机制,包括measure、layout及draw的过程,并深入探讨了ListView的工作原理,如适配器模式、recycleBin机制及其优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

事件分发机制

为什么会有事件分发机制

安卓上面的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,类似回收站

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

ListView优化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值