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