面试宝典|Android基础(三)

本篇主要讲解View及Drawable相关

View相关

Q:MotionEvent是什么?包含几种事件?什么条件下会产生?

  • 技术点:View触控
  • 参考回答::MotionEvent是手指触摸屏幕锁产生的一系列事件。包含的事件有:
    • ACTION_DOWN:手指刚接触屏幕
    • ACTION_MOVE:手指在屏幕上滑动
    • ACTION_UP:手指在屏幕上松开的一瞬间
    • ACTION_CANCEL:手指保持按下操作,并从当前控件转移到外层控件时会触发

Q:scrollTo()和scrollBy()的区别?

  • 技术点:View滑动
  • 参考回答:scrollBy内部调用了scrollTo,它是基于当前位置的相对滑动;而scrollTo是绝对滑动,因此如果利用相同输入参数多次调用scrollTo()方法,由于View初始位置是不变只会出现一次View滚动的效果而不是多次。
  • 引申:两者都只能对view内容进行滑动,而不能使view本身滑动,且非平滑,可使用Scroller有过渡滑动的效果

Q:Scroller中最重要的两个方法是什么?主要目的是?

  • 技术点:View滑动
  • 思路:从Scroller实现滑动的具体过程出发
  • 参考回答:Scroller实现滑动的具体过程:
    • 在MotionEvent.ACTION_UP事件触发时调用startScroll()方法,该方法并没有进行实际的滑动操作,而是记录滑动相关量
    • 马上调用invalidate/postInvalidate()方法,请求View重绘,导致View.draw方法被执行
    • 紧接着会调用View.computeScroll()方法,此方法是空实现,需要自己处理逻辑。具体逻辑是:先判断computeScrollOffset(),若为true(表示滚动未结束),则执行scrollTo()方法,它会再次调用postInvalidate(),如此反复执行,直到返回值为false。流程图如下:


      面试宝典|Android基础(三)_第1张图片
      View滑动流程图

      其中,最重要的两个方法是startScroll()和computeScroll()

Q:谈一谈View的事件分发机制?

  • 技术点:View事件分发
  • 思路:从分发本质、传递顺序、核心方法展开
  • 参考回答:
    • 事件分发本质:就是对MotionEvent事件分发的过程。即当一个MotionEvent产生了以后,系统需要将这个点击事件传递到一个具体的View上。
    • 点击事件的传递顺序:Activity(Window) -> ViewGroup -> View
    • 三个主要方法:
      • dispatchTouchEvent:进行事件的分发(传递)。返回值是 boolean 类型,受当前onTouchEvent和下级view的dispatchTouchEvent影响
      • onInterceptTouchEvent:对事件进行拦截。该方法只在ViewGroup中有,View(不包含 ViewGroup)是没有的。一旦拦截,则执行ViewGroup的onTouchEvent,在ViewGroup中处理事件,而不接着分发给View。且只调用一次,所以后面的事件都会交给ViewGroup处理。
      • onTouchEvent:进行事件处理。

Q:如何解决View的滑动冲突?

  • 技术点:View滑动冲突
  • 思路:从处理规则和具体实现方法展开讨论
  • 参考回答:
    • (1)处理规则:
      • 对于由于外部滑动和内部滑动方向不一致导致的滑动冲突,可以根据滑动的方向判断谁来拦截事件。
      • 对于由于外部滑动方向和内部滑动方向一致导致的滑动冲突,可以根据业务需求,规定何时让外部View拦截事件何时由内部View拦截事件。
      • 对于上面两种情况的嵌套,相对复杂,可同样根据需求在业务上找到突破点。
    • (2)实现方法:
      • 外部拦截法:指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的onInterceptTouchEvent方法,在内部做出相应的拦截。
      • 内部拦截法:指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。具体方法:需要配合requestDisallowInterceptTouchEvent方法。

Q:谈一谈View的工作原理?

  • 技术点:View工作流程
  • 思路:围绕三大流程展开
  • 参考回答:View工作流程简单来说就是,先measure测量,用于确定View的测量宽高,再 layout布局,用于确定View的最终宽高和四个顶点的位置,最后 draw绘制,用于将View 绘制到屏幕上。具体过程图见:


    面试宝典|Android基础(三)_第2张图片
    View的绘制流程
    • ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带。
    • View的绘制流程是从ViewRoot和performTraversals开始。
    • performTraversals()依次调用performMeasure()、performLayout()和performDraw()三个方法,分别完成顶级 View的绘制。
    • 其中,performMeasure()会调用measure(),measure()中又调用onMeasure(),实现对其所有子元素的measure过程,这样就完成了一次measure过程;接着子元素会重复父容器的measure过程,如此反复至完成整个View树的遍历。layout和draw同理。

Q:MeasureSpec是什么?有什么作用?

  • 技术点:View工作流程(measure)
  • 思路:从MeasureSpec作用、组成、模式和决定因素展开
  • 参考回答:
    • 作用:通过宽测量值widthMeasureSpec和高测量值heightMeasureSpec决定View的大小
    • 组成:一个32位int值,高2位代表SpecMode(测量模式),低30位代表SpecSize( 某种测量模式下的规格大小)。
    • 三种模式:
      • UNSPECIFIED:父容器不对View有任何限制,要多大有多大。常用于系统内部。
      • EXACTLY(精确模式):父视图为子视图指定一个确切的尺寸SpecSize。对应LayoutParams中的match_parent或具体数值。
      • AT_MOST(最大模式):父容器为子视图指定一个最大尺寸SpecSize,View的大小不能大于这个值。对应LayoutParams中的wrap_content。
    • 决定因素:值由子View的布局参数LayoutParams和父容器的MeasureSpec值共同决定。具体规则见下图:


      面试宝典|Android基础(三)_第3张图片
  • 引申:直接继承View的自定义View需要重写onMeasure()并设置wrap_content时的自身大小,否则效果相当于macth_parent

Q:自定义View/ViewGroup需要注意什么?

  • 技术点:自定义View
  • 参考回答:


    面试宝典|Android基础(三)_第4张图片

Q:onTouch()、onTouchEvent()和onClick()关系?

  • 技术点:View事件分发
  • 参考回答:优先度onTouch()>onTouchEvent()>onClick()。因此onTouchListener的onTouch()方法会先触发;如果onTouch()返回false才会接着触发onTouchEvent(),同样的,内置诸如onClick()事件的实现等等都基于onTouchEvent();如果onTouch()返回true,这些事件将不会被触发。
  • 引申:OnTouchListener、OnClickListener的冲突

Q:SurfaceView和View的区别?

  • 技术点:View、SurfaceView
  • 参考回答:SurfaceView是从View基类中派生出来的显示类,他和View的区别有:
    • View需要在UI线程对画面进行刷新,而SurfaceView可在子线程进行页面的刷新
    • View适用于主动更新的情况,而SurfaceView适用于被动更新,如频繁刷新,这是因为如果使用View频繁刷新会阻塞主线程,导致界面卡顿
    • SurfaceView在底层已实现双缓冲机制,而View没有,因此SurfaceView更适用于需要频繁刷新、刷新时数据处理量很大的页面

Q:invalidate()和postInvalidate()的区别?

  • 技术点:View刷新
  • 参考回答:invalidate()与postInvalidate()都用于刷新View,主要区别是invalidate()在主线程中调用,若在子线程中使用需要配合handler;而postInvalidate()可在子线程中直接调用。

Drawable相关

Q:了解哪些Drawable?适用场景?

  • 技术点:res资源
  • 参考回答:BitmapDrawable表示一张图片、NinePatchDrawable可自动地根据所需的宽/高对图片进行相应的缩放并保证不失真、ShapeDrawable表示纯色、有渐变效果的基础几何图形、StateListDrawable表示一个Drawable的集合且每个Drawable对应着View的一种状态、LayerDrawable可通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果

Q:mipmap系列中xxxhdpi、xxhdpi、xhdpi、hdpi、mdpi和ldpi存在怎样的关系?

  • 技术点:res资源
  • 参考回答:表示不同密度的图片资源,像素从高到低依次排序为xxxhdpi>xxhdpi>xhdpi>hdpi>mdpi>ldpi,根据手机的dpi不同加载不同密度的图片

Q:dp、dpi、px的区别?

  • 技术点:Android适配
  • 参考回答:
    • px:像素,如分辨率1920x1080表示高为1920个像素、宽为1080个像素
    • dpi:每英寸的像素点,如分辨率为1920x1080的手机尺寸为4.95英寸,则该手机DPI为(1920x1920+ 1080x1080)½/4.95≈445dpi
    • dp:密度无关像素,是个相对值

Q:res目录和assets目录的区别?

  • 技术点:res、assets
  • 参考回答:
    • res/raw中的文件会被映射到R.java文件中,访问时可直接使用资源ID,不可以有目录结构
    • assets文件夹下的文件不会被映射到R.java中,访问时需要AssetManager类,可以创建子文件夹

你可能感兴趣的:(面试宝典|Android基础(三))