View事件体系相关面试点(五)

本文详细解析了Android中View的基础概念,包括getX与getRawX的区别、MotionEvent的事件类型、scrollTo与scrollBy的工作机制,以及SurfaceView与普通View的差异。深入探讨了View的事件分发机制,解释了dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent的作用,以及事件分发流程。同时,文章还介绍了View的工作原理,包括measure、layout和draw的过程,以及invalidate、postInvalidate和requestLayout的区别。

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

一、View基础

  1. getX和getRawX的区别,坐标系

  2. MotionEvent有几种事件

  3. scrollTo和scrollBy的区别

    • scrollTo是绝对滑动

    • scrollBy内部调用了scrollTo是基于当前位置的相对滑动

    • 两者都只能对View的内容进行滑动,而不能使view本身滑动

  4. SurfaceView和View的区别

    • SurfaceView是从View基类中派生出来的显示类

    • View需要在UI线程进行刷新,SurfaceView可以在子线程进行页面的刷新

    • View适用于主动更新,SurfaceView适用于被动更新

    • SurfaceView在底层已实现双缓冲机制,SurfaceView更适用于需要频繁刷新、刷新时数据处理量很大的页面

二、View的事件分发

  1. 为什么会有分发机制

    • 安卓上面的View是树形结构,View可能会重叠在一起,当我们点击的地方有多个View都可以响应时,这个点击事件应该给谁呢?

  2. 事件分发三个重要方法

    • dispatchTouchEvent

    • onInterceptTouchEvent

    • onTouchEvent

  3. 事件分发流程

    • Activity -> PhoneWindow -> DecorView -> ViewGroup -> ........ -> View

  4. 事件分发过程中方法优先级onTouch() -> onTouchEvent() -> onClick()

    • onTouchListener的onTouch先触发,返回false才会触发onTouchEvent,具体查看View的dispatchTouchEvent方法即可

  5. View的滑动冲突

    • 外部拦截: 点击事件都先经过父容器的拦截处理

    • 内部拦截:父容器不拦截,将所有事件传递给子容器,子容器进行消耗处理,否则回传给父容器处理

三、View的工作原理相关

  1. View的工作流程,简单来说就是先measure侧向,用于测量View的宽高,然后在layout布局,用于确定View的最终宽高和四个顶点的位置,然后再draw绘制。

  2. measure方法需要注意ViewGroup.LayoutParams和父容器的MeasureSpec来确定子View的MeasureSpec

  3. MeasureSpec组成含义,作用

    • 通过宽高测量值决定View的大小

    • 由一个32位的int组成,高两位代表SpecMode(测量模式),低30位代表SpecSize(测量规格)

  4. invalidate方法和postInvalidate方法以及requestLayout方法区别

    • invalidate在主线程中调用,如果在子线程需要配合handler,会执行draw方法重绘,而不会重新measure、layout

    • postInvalidate可以直接在子线程里调用,会执行draw方法重绘,而不会重新measure、layout

    • requestLayout会触发measure、layout方法,draw方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值