View的事件体系(一)

View的事件体系(一)

1. View的基础知识

1. 什么是View

View是Android中所有控件的基类,不管是简单的Button和TextView还是复杂的RelativeLayout和ListView他们的共同基类还是View。

2. View的位置参数

View的位置主要由它的四个顶点来决定,分别对应View的四个属性:top,left,right,bottom,其中top是左上角的纵坐标,left是左上角的横坐标,right是右下角的横坐标,bottom是右下角的纵坐标。

x,y,translationX,translationY

x,y是View的左上角坐标,而translationX,translationY是View左上角相对于父容器的偏移量,默认值是0.

View在平移过程中,top,left表示的是原始左上角位置信息,其值不会发生改变。

3. MotionEvent 和TouchSlop

1. MotionEvent

getX/getY ,返回相对于当前View左上角的X,Y坐标,getRawX/getRawY返回相对于手机屏幕左上角的X和Y。

2. TouchSlop

TouchSlop 是系统所能识别出的被认为是滑动的最小距离。

ViewConfiguration.get(getContext()).getScaledTouchSlop()

4. VelocityTracker ,GestureDetector和Scroller

1. VelocityTracker

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

在View的onTouchEvent方法中追踪当前单击事件的速度。

VelocityTracker velocityTracker = VelocityTracker.obtain();

velecotyTracker.addMovement(event);

当我们想知道当前的滑动速度时

velocityTracker.computeCurrentVelocity(1000); //时间间隔

int xVelocity = (int)velocityTracker.getXVelocity();

int yVelocity = (int)velocityTracker.getYVelocity();

这里的速度是指一段时间手指所滑过的像素数

速度 = (终点位置 - 起始位置)/时间

velocityTracker.clear();

velocityTracker.recycle();

2. GestureDetector

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

首先,需要创建一个GestureDetector对象,并实现OnGestureListener接口,根据需要可以实现OnDoubleTapListener监听双击行为。

GestureDetector mGestureDetector = new GestureDetector(this);

mGestureDetector.setIsLongPressEnabled(false);//解决长按屏幕后无法滑动

接着,接管目标View的onTouchEvent方法,在待监听View的onTouchEvent方法中,添加如下:

boolean consume = mGestureDetector.onTouchEvent(event);

return consume;

3. Scroller

弹性滑动对象,用于实现View的弹性滑动,通过使用Scroller实现有过渡效果的滑动。

2. View的滑动

1. 使用ScrollTo/ScrollBy

ScrollBy:实现基于当前位置的相对移动

ScrollTo:实现基于所传递参数的绝对滑动

使用ScrollTo和ScrollBy来实现View的滑动,只能将View的内容进行移动,并不能将View本身移动。

2. 使用动画

通过动画我们能够让一个View进行移动,而平移就是一种滑动,使用动画来移动View,主要是操作View的translationX和translationY。

View动画是对View的影像做操作,它并不能真正改变View的位置参数,包括宽/高

会出现单击新位置无法触发onClick事件,而单击原始位置可以触发onClick事件。

3. 改变布局参数

改变布局参数即改变LayoutParams

假如我们想把一个Button向右平移100px,我们只需要将这个Button的LayoutParams里的marginLeft参数的值增加100px即可。

MarginLayoutParams params = view.getLayoutParams();

params.width+=100;

params.leftMargin+=100;

view.setLayoutParams();

4. 各种滑动方式的对比

  • ScrollTo/ScrollBy: 操作简单,适合对view的内容的滑动
  • 动画:操作简单,主要适用于没有交互的view和实现复杂的动画效果
  • 改变布局参数:操作稍微复杂,适用于有交互的View
发布了31 篇原创文章 · 获赞 9 · 访问量 1598

猜你喜欢

转载自blog.csdn.net/qq_43621019/article/details/104133185