View

作者: 谷哥得小弟 | 来源:发表于2019-02-03 15:42 被阅读49次

    Q:MotionEvent是什么?包含几种事件?什么条件下会产生?
    ACTION_UP:手指按下
    ACTION_MOVE:手指移动
    ACTION_UP:手指抬起
    ACTION_CANCEL:手指重当前view移动到外层view时

    Q:scrollTo()和scrollBy()的区别?
    scrollTo()为视图 绝对距离 的移动,scrollBy()为视图 相对距离 的移动,内部包含了scrollTo(scollX+dx,scollY+dy),dx和dy就是scrollBy()的相对距离传值。

    Q:Scroller中最重要的两个方法是什么?主要目的是?
    startScroll()和computeScroll(),首先Scroller系统封装类为了解决scrollTo()和scrollBy()滑动不顺畅的。
    Scroller内含插值器,让我们控件可以平滑的滑动、先加速后减速、先减速后加速滑动等,执行流程:
    1、初始化Scroller
    2、调用startScroll()开始滚动,此时并真的开始,只是录入时间,距离,Interpolator等
    3、执行invalidate()刷新界面
    4、重写View的computeScroll()并在其内部实现与滚动相关的业务逻辑,这里才开始真正的滚动逻辑,这里可以条用scrollTo()进行滚动,在第二步已经给出了相关参数,我们可以计算出当前步需要滚动的距离以及时间
    5、再次执行invalidate()刷新界面

    Q:谈一谈View的事件分发机制?
    这个分发机制最好理解是一张U形图:

    事件分发.png

    Q:如何解决View的滑动冲突?
    解决冲突可以从两方面着手:
    外部view拦截:如果外部viewGroup需要滑动则调用onInterceptTouchEvent并在内部做相应的拦截,放回true让viewGroup的onTouchEvent()消费事件
    内部view拦截:父容器不拦截任何事件,传递给子view如果需要就进行拦截,这种就需要我们在子view通知父容器不要拦截当前我需要的事件,通知方式为requestDisallowInterceptTouchEvent()

    Q:谈一谈View的工作原理?
    view的工作工程包含onMesure() 测量宽高、onLayout()布局、onDraw绘图三个主要过程;而整个绘制过程其实是一颗viewTree的绘制,即由根视图向子视图进行绘制:activity----PhoneWindow------DecoreView-----view;

    view层级绘制.png
    最后我们整个绘制过程全写在了performTraversals()方法中,如下:
    view绘制.png

    Q:MeasureSpec是什么?有什么作用?
    MeasureSpec是一种可以提供父容器布局向子view宽高转换的静态工具类,里面大多是位运算,提供三种控制模式:
    UNSPECIFIED:无限制模式,
    EXACTLY:父向子指定精确的尺寸,
    AT_MOST:父向子提供一个最大尺寸;
    onMesure()中通过宽测量值widthMeasureSpec和高测量值heightMeasureSpec决定View的大小

    Q:自定义View/ViewGroup需要注意什么?
    1、测量好宽高onMesure()
    2、内部避免调用handler,使用view.post
    3、线程和动画需要及时关闭
    4、处理好嵌套

    Q:onTouch()、onTouchEvent()和onClick()关系?
    执行先后顺序:onTouch()>onTouchEvent()>onClick()

    Q:SurfaceView和View的区别?
    view 在主线程进行刷新,适合一般的界面;SurfaceView可以在子线程进行频繁刷新,适合数据量大的界面,比如视频、相机、游戏

    Q:invalidate()和postInvalidate()的区别?
    主线程刷新:invalidate()
    子线程刷新:postInvalidate()

    相关文章

      网友评论

          本文标题:View

          本文链接:https://www.haomeiwen.com/subject/tfzrsqtx.html