Android实现手势滑动多点触摸放大缩小图片效果

2019-12-10 19:07:12刘景俊

说之前大家要明白单点与多点的区别:
单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
上面只是简单说下流程,详细请大家自行研究,这里只是讲解如果运用.

/*** 
   * touch 事件 
   */ 
  @Override 
  public boolean onTouchEvent(MotionEvent event) { 
    /** 处理单点、多点触摸 **/ 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
      onTouchDown(event); 
      break; 
    // 多点触摸 
    case MotionEvent.ACTION_POINTER_DOWN: 
      onPointerDown(event); 
      break; 
 
    case MotionEvent.ACTION_MOVE: 
      onTouchMove(event); 
      break; 
    case MotionEvent.ACTION_UP: 
      mode = MODE.NONE; 
      break; 
 
    // 多点松开 
    case MotionEvent.ACTION_POINTER_UP: 
      mode = MODE.NONE; 
      /** 执行缩放还原 **/ 
      if (isScaleAnim) { 
        doScaleAnim(); 
      } 
      break; 
    } 
 
    return true; 
  } 

这里的实现我都分开写了,利于大家的观看,在这里我顺便说一下自定义控件返回值:如果对于没有孩子的控件,如果要对Touch处理最好return true.这样也是游戏开发中经常用的,如果该控件有孩子的话,可不要这么弄,不然孩子会监听不到Touch事件.

下面我们一个一个方法的看:
onTouchDown:获取手指点击时候的起始坐标.

/** 按下 **/ 
  void onTouchDown(MotionEvent event) { 
    mode = MODE.DRAG; 
 
    current_x = (int) event.getRawX(); 
    current_y = (int) event.getRawY(); 
 
    start_x = (int) event.getX(); 
    start_y = current_y - this.getTop(); 
 
  } 

这里大家也要明白 event.getRawX()和event.getX(),不过我相信大家都明白的,我前面那篇ListView拖拽也提到过.一个相对屏幕,一个相对父控件.

onPointerDown:两手指之间的距离.

/** 两个手指 只能放大缩小 **/ 
  void onPointerDown(MotionEvent event) { 
    if (event.getPointerCount() == 2) { 
      mode = MODE.ZOOM; 
      beforeLenght = getDistance(event);// 获取两点的距离 
    } 
  }