当希望 处理 点击view 或者滑动屏幕 的 事件的时候 我们会设置一些 监听器
1、常规的点击滑动的事件处理
设置一些监听器、如button、seekBar 等的onClickListener() onScrollLisrener() onLongClickListener() setOnKeyListener()等等。。。。可以进行一些常规的 点击事件的处理。
2、当我们进行一些复杂的手势 处理的时候 常规的监听器就不够用了
我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法来获取坐标后进行判断处理。
1)可以给view 设置 onTouchListner() 重写他的onTouch(View view MotionEvent event)如下:
view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN : float startX = event.getX(); ............ case MotionEvent.ACTION_MOVE: float endX = event.getX(); .......... } return true; } });
但是, 这样要 程序员自己 通用 计算 startX endX等值来判断 到底用户是怎么样的手势。
2)重写View 类的 onTuchEvent(MotionEvent event)方法 来处理 这些手势事件
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mStartY = event.getY(); mStartX = event.getX(); break; case MotionEvent.ACTION_MOVE: mEndY = event.getY(); mEndX = event.getX(); float dy = mEndY - mStartY; if (Math.abs(dy) < 20) break; //低于20像素的滑动不算 if (mStartX < 0.25 * mWindowWidth && mEndX < 0.25 * mWindowWidth) { //滑动的是屏幕的左边 float percent = dy / mWindowHeignt; mBrightness = mBrightness - percent * 255f; if (mBrightness > 255f) { mBrightness = 255f; } else if (mBrightness < 0) { mBrightness = 0; } setScreenBrightness((int) mBrightness); mStartY = mEndY; } else if (mStartX > 0.75 * mWindowWidth && mEndX > 0.75 * mWindowWidth) { //滑动的是屏幕的右边 float percent = dy / mWindowHeignt; mCurrentVolume = mCurrentVolume - percent * mMaxVolume; if (mCurrentVolume > mMaxVolume) { mCurrentVolume = mMaxVolume; } else if (mCurrentVolume < 0) { mCurrentVolume = 0; } mStartY = mEndY; setVolume(); //设置 系统的声音 } break; case MotionEvent.ACTION_UP: btVolume.setVisibility(View.GONE); btBright.setVisibility(View.GONE); mEndY = event.getY(); if (Math.abs(mEndY - mStartY) < 10) { //相当于点击了屏幕 呼唤出控制界面 showOrDismissTools(); //显示或者隐藏 工具控制栏 } break; } return true; }这两种方法 对事件的处理方法都是一样的 要自己来计算处理识别 手势 比较灵活
3)使用GestureDetector类来处理 手势
Androidsdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,它的内部已经将很多的滑动事件识别成了手势类型,通过这个类我们可以识别很多
的手势类型:
手势识别器的使用步骤:
1、创建 手势识别器:
public GestureDetector mGestureDetector = new GestureDetector(Context context, GestureDetector.OnGestureListener listener);
第一个参数是 context 第二个参数是 一个回到接口OnGestureListener,OnDoubleTapListener,SimpleOnGestureListener。他们三个都是 接口类,我们要写一个他们的 实现类 然后传给GestureDetector以便它回调
查看源码可以看到SimpleOnGestureListener 它实现了 GestureDetector的三个接口
public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener,OnContextClickListener {.......}所以开发中 多用 自己的监听器继承SimpleOnGestureListener 然后重写要实现的方法
//1、创建一个手势识别器 private GestureDetector mGestureDetector = new GestureDetector(getApplicationContext(),new MySimpleOnGestureListener()); //3、将MotionEvent 事件传给GestureDetector处理 // MotionEvent 可以来自OnTouchEvent(MotionEvent event) 或者来自OnTouchListener的onTouch(View view,MotionEvent event); // 这里使用来自OnTouchEvent(MotionEvent event)的效果是一样的 @Override public boolean onTouchEvent(MotionEvent event) { return mGestureDetector.onTouchEvent(event); //将事件传递给了GestureDetector 然后它内部将事件进行判断识别 调用监听器中的对应方法 //最终实现事件的处理 } //2、写一个 手势识别器回到子类-----在里面处理各个手势对应的代码public class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener{@Override public boolean onDown(MotionEvent e) { //填写自己要处理的代码 return false; } .....缩略很多个要实现的方法............. @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //填写自己要处理的代码 return false; } }
SimpleOnGestureListener 可以重写的 方法 分别对应不同的手势事件
除了上面的 手势识别器 还有 缩放手势识别器(ScaleGestureDetector)
private ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(Context context, OnScaleGestureListener listener)