zoukankan      html  css  js  c++  java
  • 《安卓开发艺术探索》第三章 View的事件体系—学习笔记

    这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。

    什么是View?

    View是所有控件的基类,ViewGroup也是View的子类。ViewGroup中包含多个View。
    View的典型子类:Button、TextView等…
    ViewGroup典型的子类:LinearLayout、RelativeLayout等…

    View的位置参数

    位置参数.PNG
    其中getLeft()、getRight()、getTop()、getBottom()是View中的方法
    getX()、getY()、getRawX()、getRawY()是MotionEvent中的方法

    TouhSlop

    是系统所能识别出的被认为是滑动的最小距离,意思当手指滑动时,两次滑动之间的距离小于这个常量,系统就不认为是滑动操作。

    VelocityTracker

    速度追踪器,用于追踪手指在滑动过程中的速度。

    GestureDetector

    手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。

    Scroller

    弹性滑动对象、用于实现View的弹性滑动

    View的滑动

    1.使用scrollTo/scrollBy
    2.使用动画ObjectAnimator
    3.改变布局参数LayoutParams

    弹性滑动

    1.使用Scroller
    2.通过动画ObjectAnimator/ValueAnimator
    3.使用延时策略使用Handler或者View的postDelayed

    View的事件分发机制

    所谓点击事件的分发,就是对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,系统需要把这个事件传递到具体的View,这个传递的过程就是分发的过程。

    重要方法

    dispatchTouchEvent(MotionEvent ev);进行时事件的分发
    onInterceptTouchEvent(MotionEvent ev);用来判断是否拦截某个事件
    onTouchEven(MotionEvent ev);处理点击事件

    事件的调度顺序应该是

    onTouchListener > onTouchEvent > onLongClickListener > onClickListener。

    结论总结

    ViewGroup默认不拦截任何事件,onInterceptTouchEvent方法默认返回false。
    View没有onInterceptTouchEvent方法,有点击事件传递给它,就调用它的onTouchEvent方法。
    View只要它的clickable或者longClickable有一个为true,TouchEvent就返回true。不受View的enable属性影响。

    View的滑动冲突

    常见滑动冲突

    1.外部滑动方向和内部滑动方向不一致
    2.外部滑动方向和内部滑动方向一致
    3.上面两种情况的嵌套

    滑动冲突的解决方式

    1.外部拦截法:指的是点击事件先经过父容器的拦截处理,父容器需要此事件就拦截。外部拦截法需要重写父容器的onInterceptTouchEvent方法
    2.内部拦截法:指的是父容器不拦截任何事件,所有事件都传递给子元素,子元素需要此事件就直接消耗掉,否则就由父容器处理。此方法需要重写子元素的dispatchTouchEvent方法还需要配合requestDisallowInterceptTouchEvent才能正常工作。

    由于内部拦截法相对外部拦截法相对复杂,一般建议采用外部拦截法来解决常见的滑动冲突。

  • 相关阅读:
    APP高级抓包
    Linux使用日志
    ffmpeg使用记录
    win7 远程连接ubuntu
    v-2-r-a-y使用
    adb
    golang mysql 模糊查询
    交互式批量删除指定目录下指定类型文件
    golang打包和部署到centos7
    Nginx unknown directive ""
  • 原文地址:https://www.cnblogs.com/cloud9527/p/13161488.html
Copyright © 2011-2022 走看看