1.MotionEvent
ACTION_DOWN,ACTION_UP,ACTION_MOVE
getX/getY相对当前View 左上角X ,Y
getRawX/getRawY 相对手机屏幕左上角X,Y
2. TouchSlop(常量跟设备有关,Android源码中定义为8dp)
系统所能识别的最小滑动距离
获取方式: ViewConfiguration.get(getBaseContext()).getScaledTouchSlop();返回的是像素
3. VelocityTracker
用于追踪手指在屏幕的滑动速度(有X,Y两个方向)速度可以是负值
用法:在View的onTouchEvent()
@Override
public boolean onTouchEvent(MotionEvent event) {
//创建
VelocityTracker velocityTracker=VelocityTracker.obtain();
velocityTracker.addMovement(event);
//计算
velocityTracker.computeCurrentVelocity(1000);//设定计算时间,毫秒为单位
float XVelocity=velocityTracker.getXVelocity();
float YVelocity=velocityTracker.getYVelocity();
Log.d(TAG, "XVelocity: "+XVelocity+" YVelocity: "+YVelocity);
return super.onTouchEvent(event);
}
注意:不需要使用时要回收占用的内存
velocityTracker.clear();
velocityTracker.recycle();
4. GestureDetector
检测单击,滑动,双击等行为
使用方法:
1. 创建一个GestureDetector对象并实现OnGestureListener()接口,根据需求也可以实现OnDoubleTapListener().
2. 监听自定义View的onTouchEvent方法,返回mGestureDetector.onTouchEvent
5. Scroller
用于实现View的弹性滑动
scrollerTo(),scrollerBy()只能改变view中内容位置,不能改变view在布局的位置
一个简单View 滑动例子:
int mLastX=0,mLastY=0;
@SuppressLint("NewApi") @Override
public boolean onTouchEvent(MotionEvent event) {
// 相对本身来滑动,也可以相对手机屏幕来滑动
int x=(int)event.getX();
int y=(int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int deltaX=x-mLastX;
int deltaY=y-mLastY;
int translationX=(int)getTranslationX()+deltaX;
int translationY=(int)getTranslationY()+deltaY;
setTranslationX(translationX);
setTranslationY(translationY);
break;
case MotionEvent.ACTION_UP:
//松手后回到初始位置
setTranslationX(0);
setTranslationY(0);
break;
}
mLastX=x;
mLastY=y;
return true;
}