Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:【张鸿洋的博客】

上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix;具体请参考:Android 手势检测实战 打造支持缩放平移的图片预览效果(上);本篇继续完善我们的ImageView~~

首先加入放大后的移动~~

1、自由的进行移动

我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~

@Override public boolean onTouch(View v, MotionEvent event) {  mScaleGestureDetector.onTouchEvent(event);  float x = 0, y = 0;  // 拿到触摸点的个数  final int pointerCount = event.getPointerCount();  // 得到多个触摸点的x与y均值  for (int i = 0; i < pointerCount; i++)  {   x += event.getX(i);   y += event.getY(i);  }  x = x / pointerCount;  y = y / pointerCount;  /**   * 每当触摸点发生变化时,重置mLasX , mLastY    */  if (pointerCount != lastPointerCount)  {   isCanDrag = false;   mLastX = x;   mLastY = y;  }    lastPointerCount = pointerCount;  switch (event.getAction())  {  case MotionEvent.ACTION_MOVE:   Log.e(TAG, "ACTION_MOVE");   float dx = x - mLastX;   float dy = y - mLastY;      if (!isCanDrag)   {    isCanDrag = isCanDrag(dx, dy);   }   if (isCanDrag)   {    RectF rectF = getMatrixRectF();    if (getDrawable() != null)    {     isCheckLeftAndRight = isCheckTopAndBottom = true;     // 如果宽度小于屏幕宽度,则禁止左右移动     if (rectF.width() < getWidth())     {      dx = 0;      isCheckLeftAndRight = false;     }     // 如果高度小雨屏幕高度,则禁止上下移动     if (rectF.height() < getHeight())     {      dy = 0;      isCheckTopAndBottom = false;     }     mScaleMatrix.postTranslate(dx, dy);     checkMatrixBounds();     setImageMatrix(mScaleMatrix);    }   }   mLastX = x;   mLastY = y;   break;  case MotionEvent.ACTION_UP:  case MotionEvent.ACTION_CANCEL:   Log.e(TAG, "ACTION_UP");   lastPointerCount = 0;   break;  }  return true; }

首先我们拿到触摸点的数量,然后求出多个触摸点的平均值,设置给我们的mLastX , mLastY , 然后在移动的时候,得到dx ,dy 进行范围检查以后,调用mScaleMatrix.postTranslate进行设置偏移量,当然了,设置完成以后,还需要再次校验一下,不能把图片移动的与屏幕边界出现白边,校验完成后,调用setImageMatrix.

这里:需要注意一下,我们没有复写ACTION_DOWM,是因为,ACTION_DOWN在多点触控的情况下,只要有一个手指按下状态,其他手指按下不会再次触发ACTION_DOWN,但是多个手指以后,触摸点的平均值会发生很大变化,所以我们没有用到ACTION_DOWN。每当触摸点的数量变化,我们就会跟新当前的mLastX,mLastY.

下面是上面用到的两个私有方法,一个用于检查边界,一个用于判断是否是拖动的操作:

/**  * 移动时,进行边界判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值