当希望   处理       点击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  可以重写的 方法  分别对应不同的手势事件

android 中点击换一换 安卓滑动变点击_android 中点击换一换


除了上面的  手势识别器  还有  缩放手势识别器(ScaleGestureDetector)

private ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(Context context, OnScaleGestureListener listener)