View的事件体系

1.什么是View

View是Android中所有控件的基类,View是界面层的控件的一种抽象。

2.位置参数

在Android中,x轴和y轴的正方向分别为左上角的右和下;

view的位置由四个顶点决定:top , left , right , bottom;

Android3.0以后新增x , y translationX , translationY;

关系:

x = left + translationX

y = top + translationY

注意:在平移的过程中top , left表示原始左上角的位置信息

3.MotionEvent & TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离和设备有关(默认是8)。

最小滑动距离:

ViewConfiguration.get(context).getScaledTouchSlop()

作用:过滤(滑动的临界值,当小于该值时则被认为没有滑动)

4.VelocityTracker & GestureDetector & Scroller

  • VelocityTracker : 速度追踪,追踪手指在滑动过程中的速度,可以为负数
    速度 = (终点位置 - 起点位置)/时间段
  • GestureDetector : 手势检测,辅助检测用户的单击,滑动,长按,双击等行为。
    建议:如果只是监听滑动,在onTouchEvent中实现;如果监听双击行为,是要GestureDetector
  • Scroller : 弹性滑动对象,用于实现View的弹性滑动。

5.View的滑动

方法:

  1. View本身提供的scrollTo() / scrollBy() : 移动的是View的内容,不能改变view在布局中的位置;向右(向下)滑动 mScrollX(mScrollY)为负;适合对View内容的滑动
  2. 使用动画:改变View的translationX , translationY的值;实现复杂的动画效果
  3. 改变view的LayoutParams:设置margin值,或者根据layout来改变空view的width;适合有交互的view

6.弹性滑动

  1. 使用Scroller
    注意: mScroller.startScroll() 保存我们传递的参数,并没有执行滑动相关的操作
    Scroller本身并不能实现View的滑动,需要配合View的computeScroll()
  2. 使用动画

7.View的事件分发机制

点击事件的分发由三个方法来共同完成:

dispatchTouchEvent() : 分发事件

onInterceptTouchEvent() : 拦截事件

onTouchEvent() : 处理事件

注意:

同一事件序列:指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束(ACTION_DOWN开始,最终以ACTION_UP结束);通常同一事件序列只能被一个View拦截且消耗,并且一旦View决定拦截,那么这个事件序列都只能由他来处理。

如果一个View不消耗ACTION_DOWN事件,那么同一事件的其他的事件都不会再交给他处理。

默认: ViewGroup的onInterceptTouchEvent返回false; View的onTouchEvent返回true

顶级View对点击事件的分发过程:

8.滑动冲突

  1. 滑动冲突场景
  2. 处理规则
    场景一的处理规则:当用户左右滑动时,让外部拦截;当用户上下滑动时,内部view拦截处理
    场景二的处理规则:从业务上找到突破点
  3. 解决方式
    外部拦截法
    ACTION_DOWN事件必须返回false(如果返回true,那么接下来的ACTION_MOVE事件都会被父容器拦截);
    ACTION_MOVE根据需求做处理;
    ACTION_UP必须返回false(如果返回true,那么子元素的onClick事件就无法触发)
    内部拦截法
    需要调用父容器的requestDisallowInterceptTouchEvent()
    该方法的作用是请求不允许拦截触摸事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值