Android开发Android开发经验谈Android技术知识

View

2020-05-06  本文已影响0人  InFatuated

1、讲一下View的绘制机制

View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure是确定View的测量宽/高,layout确定View的最终宽/高和四个顶点的位置,而draw则将View绘制到屏幕上。

View的绘制过程遵循如下步骤:

2、MotionEvent是什么?包含几种事件。典型的事件类型有如下:

MotionEvent是手指接触屏幕后所产生的一系列事件,典型的事件类型如下:

正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,如以下几种状况:

3、描述一下View事件传递分发机制?

View事件分发本质就是MotionEvent事件分发的过程。即当一个MotionEvent发生后,系统将这个点击事件传递到一个具体的View上

点击事件的传递顺序Activity(Window)→ViewGroup→View

事件分发过程由三个方法共同完成:

4、如何解决View的事件冲突?举个开发中遇到的例子?

常见开发中ScrollView与RecyclerView的滑动事件冲突、RecyclerView内嵌同时滑动同一方向。
滑动冲突的处理规则:

滑动冲突的时间方法:

5、scrollTo()和scrollBy()区别?

scrollBy内部调用scrollTo,它是基于当前位置相对滑动;而scrollTo是绝对滑动,因此如果使用相同输入参数多次调用scrollTo方法,由于View的初始位置是不变的,所以View只会出现一次View的滚动效果。

两者都只对View内容的滑动,而非使View本身滑动,可以使用Scroller有过度的滑动效果。

6、Scroller是怎么实现View的弹性滑动?

在MotionEvent.ACTION_UP事件触发调用startScroll()方法,该方法并没有进行实际的滑动操作,而是记录滑动相关量(滑动距离,滑动时间)

接着调用invalidate/postInvalidate()方法,请求View重绘,导致View.draw方法被执行。

当View重绘后在draw方法调用computeScroll方法,而computeScroll又会去向Scroller获取当前的ScrollX和ScrollY;然后通过ScrollTo去实现滑动 ;接着又调用postInvaildate方法来进行第二次重绘,和之前的流程一样,如此反复导致View不断进行小幅度的滑动,而多次的小幅度滑动就组成了弹性的滑动,直到整个滑动过程结束。

7、invalidate()和postInvalidate()的区别?

invalidate()和postInvalidate()都是用于刷新View,主要区别是invalidate()在主线程中调用,posteInvalidate()是在子线程中调用,若在子线程中使用需要配合handler;而postInvalidate()可在子线程中直接调用。

8、SurfaceView和View的区别?

View需要再UI线程对画面进行刷新,而SurfaceView可在子线程进行页面的刷新。

View适用于主动更新的情况,而SurfaceView适用于被动更新,如频繁刷新,这是因为如果使用View频繁刷新会阻塞主线程,导致界面卡顿。

surfaceView在底层已实现双缓冲机制,而View没有,因此SurfaceView更适用于需要频繁刷新,刷新时数据处理很大的页面(如视频播放界面)

9、自定义如何考虑机型适配

合理使用warp_content,match_parent。

尽可能的使用RelativeLayout(相对布局)。

针对不同的机型,使用不同的布局文件,放在对应的目录下,android会自动匹配。

尽量使用.9图片。

使用与密度无关的像素单位dp,sp。

引入android百分比布局

切图的时候,大分辨率的图,应用到布局当中,在小分辨率的手机上会有很好的显示效果。

上一篇 下一篇

猜你喜欢

热点阅读