View的事件体系

本文深入探讨了Android中View的事件体系,包括位置参数、触控系列、滑动机制和事件分发。详细解析了MotionEvent、TouchSlop、VelocityTracker和GestureDetector在触控事件中的作用。此外,还介绍了实现View滑动的三种方式,如scrollTo/scrollBy、动画平移和改变布局参数。文章特别强调了事件分发的流程,包括dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent的方法,以及点击事件的传递过程和处理优先级。
摘要由CSDN通过智能技术生成

View事件的体系

  1. 1、view的位置参数
  2. 2、view的触控
  3. 3、view的滑动
  4. 4、view的事件分发机制
  5. 5、view滑动冲突

View的工作原理

  1. 6、view工作流程
  2. 7、自定义view

关于View
在Android中View是所有控件(Button、RelationLayout等)的基类,其中也包括ViewGroup在内,ViewGroup是代表控件的集合。

一、view的位置参数

a、Android坐标系:以屏幕的左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向。
b、View的位置由它的四个顶点决定,分别对应View的四个属性:top、left、right、bottom。其中left是左上角的横坐标,right是右下角的横坐标,top是左上角的纵坐标,bottom是右下角的纵坐标。注意这些坐标是相对于view父容器而言,是一种相对的坐标。具体关系见下图:
在这里插入图片描述

因此,View的宽高和坐标关系:width = right - left,height = bottom - top。

可利用View中的get方法获取上述属性,如下:

  1. Left = getLeft();
  2. Right = getRight();
  3. Top = getTop();
  4. Bottom = getBottom();
  5. width = getWidth();
  6. height = getHeight();

从Android3.0开始,View增加了额外的参数:x,y,trancelationX、translationY。其中x和y是View左上角的坐标,trancelationX 和trancelationY是View左上角相对于父容器的偏移量,他们默认值是0.这些参数也是相对于View容器。具体如下:
在这里插入图片描述

1、参在的关系:x = left + trancelationX,y = top + translationY
2、由此可见,x和left不同体现在:left是View的初始坐标,在绘制完毕后就不会再改变;而x是View偏移后的实时坐标,是实际坐标。y和top的区别同理。

类似地,安卓也提供了相应的get/set方法。需要注意的是,在onCreate()方法里无法获取到View的坐标参数,这是因为此时View还未开始绘制,全部坐标参数将都是0。

GestureDetector的介绍
内部有三个Listener接口,用于回调不同类型的触摸事件。
1、OnGestureListener
2、OnDoubleTapListener
3、OnContextClickListener
4、SimpleOnGestureListener

二、触控系列

1、MotionEvent:在手机接触屏幕后所产生的一系列事件
ACTION_DOWN:手指刚接触到屏幕;
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手指从屏幕上松开的瞬间

事件列:从手指接触屏幕至手指离开屏幕,这个过程产生的一系列事件
任何事件列都是以DOWN事件开始,UP事件结束,中间有无数的MOVE事件。如图:

在这里插入图片描述
通过MotionEvent对象可以得到触摸事件的x、y坐标。其中通过getX()、getY()可获取相对于当前的View 左上角的x 和 y坐标;通过getRawX和getRawY,他们的区别很简单,getRawX和getRawY是手机屏幕的左上角的x 、y坐标
在这里插入图片描述
2、TouchSlop
TouchSlop:系统所能识别的最小的滑动距离。即当手指在屏幕上滑动时,如果两次的距离都小于这个常量,那么系统不认为你在滑动操作。

此常量与设备有关(在不同的手机上的值是不同的),获取办法:
ViewConfiguration.get(getContext()).getScaledTouchSlop();

3、VelocityTracker:
速度追踪,用于追踪手指在滑块滑动过程中的速度,包括水平、竖直方向的速度。

使用过程:首先在View的onTouchEvent方法中追追踪当前单击事件的速度:

VelocityTracker velocityTrack = VelocityuTracker.obtain();	//实例化VelocityTrack
velocityTracker.addMovement(event);	//提娜佳追踪事件

接着在ACTION_UP事件中获取当前的速度。注意这里计算的是1000ms时间间隔移动的像素值,假设像素是100,即速度是每秒100像素。另外,手指逆着坐标系的正方向滑动,所产生的速度为负值,顺着正反向滑动,所产生的速度为正值。

velocityTracker.computeCurrentVelocity(1000);	//获取速度前计算速度,这里计算的是在1000毫秒内的
int xVelocity = velocityTrack.getXVelocity();	//获取水平方向的速度(从左向右)
int yVelocity = velocityTrack.getYVelocity();	//获取竖直方向上的速度

最后,当不需要使用它的时候,需要调用clear()方法来重置并回收内存:

velocityTrack.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值