转自:http://blog.csdn.net/way_ping_li/article/details/8477786

方法一:

将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener。
例如:imageView.setOnTouchListener(new MulitPointTouchListener ());

在xml中要将ImageView的缩放格式改成Matrix

例如:android:scaleType="matrix"

这样就可以实现图片的缩放了

下面是MulitPointTouchListener.java代码:

[java] view plaincopy
  1. public class MulitPointTouchListener implements OnTouchListener {
  2. private static final String TAG = "Touch";
  3. // These matrices will be used to move and zoom image
  4. Matrix matrix = new Matrix();
  5. Matrix savedMatrix = new Matrix();
  6. // We can be in one of these 3 states
  7. static final int NONE = 0;
  8. static final int DRAG = 1;
  9. static final int ZOOM = 2;
  10. int mode = NONE;
  11. // Remember some things for zooming
  12. PointF start = new PointF();
  13. PointF mid = new PointF();
  14. float oldDist = 1f;
  15. @Override
  16. public boolean onTouch(View v, MotionEvent event) {
  17. ImageView view = (ImageView) v;
  18. // Log.e("view_width",
  19. // view.getImageMatrix()..toString()+"*"+v.getWidth());
  20. // Dump touch event to log
  21. dumpEvent(event);
  22. // Handle touch events here...
  23. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  24. case MotionEvent.ACTION_DOWN:
  25. matrix.set(view.getImageMatrix());
  26. savedMatrix.set(matrix);
  27. start.set(event.getX(), event.getY());
  28. //Log.d(TAG, "mode=DRAG");
  29. mode = DRAG;
  30. //Log.d(TAG, "mode=NONE");
  31. break;
  32. case MotionEvent.ACTION_POINTER_DOWN:
  33. oldDist = spacing(event);
  34. //Log.d(TAG, "oldDist=" + oldDist);
  35. if (oldDist > 10f) {
  36. savedMatrix.set(matrix);
  37. midPoint(mid, event);
  38. mode = ZOOM;
  39. //Log.d(TAG, "mode=ZOOM");
  40. }
  41. break;
  42. case MotionEvent.ACTION_UP:
  43. case MotionEvent.ACTION_POINTER_UP:
  44. mode = NONE;
  45. //Log.e("view.getWidth", view.getWidth() + "");
  46. //Log.e("view.getHeight", view.getHeight() + "");
  47. break;
  48. case MotionEvent.ACTION_MOVE:
  49. if (mode == DRAG) {
  50. // ...
  51. matrix.set(savedMatrix);
  52. matrix.postTranslate(event.getX() - start.x, event.getY()
  53. - start.y);
  54. } else if (mode == ZOOM) {
  55. float newDist = spacing(event);
  56. //Log.d(TAG, "newDist=" + newDist);
  57. if (newDist > 10f) {
  58. matrix.set(savedMatrix);
  59. float scale = newDist / oldDist;
  60. matrix.postScale(scale, scale, mid.x, mid.y);
  61. }
  62. }
  63. break;
  64. }
  65. view.setImageMatrix(matrix);
  66. return true; // indicate event was handled
  67. }
  68. private void dumpEvent(MotionEvent event) {
  69. String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
  70. "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
  71. StringBuilder sb = new StringBuilder();
  72. int action = event.getAction();
  73. int actionCode = action & MotionEvent.ACTION_MASK;
  74. sb.append("event ACTION_").append(names[actionCode]);
  75. if (actionCode == MotionEvent.ACTION_POINTER_DOWN
  76. || actionCode == MotionEvent.ACTION_POINTER_UP) {
  77. sb.append("(pid ").append(
  78. action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
  79. sb.append(")");
  80. }
  81. sb.append("[");
  82. for (int i = 0; i < event.getPointerCount(); i++) {
  83. sb.append("#").append(i);
  84. sb.append("(pid ").append(event.getPointerId(i));
  85. sb.append(")=").append((int) event.getX(i));
  86. sb.append(",").append((int) event.getY(i));
  87. if (i + 1 < event.getPointerCount())
  88. sb.append(";");
  89. }
  90. sb.append("]");
  91. //Log.d(TAG, sb.toString());
  92. }
  93. private float spacing(MotionEvent event) {
  94. float x = event.getX(0) - event.getX(1);
  95. float y = event.getY(0) - event.getY(1);
  96. return FloatMath.sqrt(x * x + y * y);
  97. }
  98. private void midPoint(PointF point, MotionEvent event) {
  99. float x = event.getX(0) + event.getX(1);
  100. float y = event.getY(0) + event.getY(1);
  101. point.set(x / 2, y / 2);
  102. }
  103. }

方法二:自定义一个ImageView,例如TouchImageView:

[java] view plaincopy
  1. import android.content.Context;
  2. import android.graphics.Matrix;
  3. import android.graphics.PointF;
  4. import android.graphics.drawable.Drawable;
  5. import android.util.AttributeSet;
  6. import android.util.Log;
  7. import android.view.MotionEvent;
  8. import android.view.ScaleGestureDetector;
  9. import android.view.View;
  10. import android.widget.ImageView;
  11. public class TouchImageView extends ImageView {
  12. Matrix matrix;
  13. // We can be in one of these 3 states
  14. static final int NONE = 0;
  15. static final int DRAG = 1;
  16. static final int ZOOM = 2;
  17. int mode = NONE;
  18. // Remember some things for zooming
  19. PointF last = new PointF();
  20. PointF start = new PointF();
  21. float minScale = 1f;
  22. float maxScale = 3f;
  23. float[] m;
  24. int viewWidth, viewHeight;
  25. static final int CLICK = 3;
  26. float saveScale = 1f;
  27. protected float origWidth, origHeight;
  28. int oldMeasuredWidth, oldMeasuredHeight;
  29. ScaleGestureDetector mScaleDetector;
  30. Context context;
  31. public TouchImageView(Context context) {
  32. super(context);
  33. sharedConstructing(context);
  34. }
  35. public TouchImageView(Context context, AttributeSet attrs) {
  36. super(context, attrs);
  37. sharedConstructing(context);
  38. }
  39. private void sharedConstructing(Context context) {
  40. super.setClickable(true);
  41. this.context = context;
  42. mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
  43. matrix = new Matrix();
  44. m = new float[9];
  45. setImageMatrix(matrix);
  46. setScaleType(ScaleType.MATRIX);
  47. setOnTouchListener(new OnTouchListener() {
  48. @Override
  49. public boolean onTouch(View v, MotionEvent event) {
  50. mScaleDetector.onTouchEvent(event);
  51. PointF curr = new PointF(event.getX(), event.getY());
  52. switch (event.getAction()) {
  53. case MotionEvent.ACTION_DOWN:
  54. last.set(curr);
  55. start.set(last);
  56. mode = DRAG;
  57. break;
  58. case MotionEvent.ACTION_MOVE:
  59. if (mode == DRAG) {
  60. float deltaX = curr.x - last.x;
  61. float deltaY = curr.y - last.y;
  62. float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale);
  63. float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale);
  64. matrix.postTranslate(fixTransX, fixTransY);
  65. fixTrans();
  66. last.set(curr.x, curr.y);
  67. }
  68. break;
  69. case MotionEvent.ACTION_UP:
  70. mode = NONE;
  71. int xDiff = (int) Math.abs(curr.x - start.x);
  72. int yDiff = (int) Math.abs(curr.y - start.y);
  73. if (xDiff < CLICK && yDiff < CLICK)
  74. performClick();
  75. break;
  76. case MotionEvent.ACTION_POINTER_UP:
  77. mode = NONE;
  78. break;
  79. }
  80. setImageMatrix(matrix);
  81. invalidate();
  82. return true; // indicate event was handled
  83. }
  84. });
  85. }
  86. public void setMaxZoom(float x) {
  87. maxScale = x;
  88. }
  89. private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
  90. @Override
  91. public boolean onScaleBegin(ScaleGestureDetector detector) {
  92. mode = ZOOM;
  93. return true;
  94. }
  95. @Override
  96. public boolean onScale(ScaleGestureDetector detector) {
  97. float mScaleFactor = detector.getScaleFactor();
  98. float origScale = saveScale;
  99. saveScale *= mScaleFactor;
  100. if (saveScale > maxScale) {
  101. saveScale = maxScale;
  102. mScaleFactor = maxScale / origScale;
  103. } else if (saveScale < minScale) {
  104. saveScale = minScale;
  105. mScaleFactor = minScale / origScale;
  106. }
  107. if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight)
  108. matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2);
  109. else
  110. matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
  111. fixTrans();
  112. return true;
  113. }
  114. }
  115. void fixTrans() {
  116. matrix.getValues(m);
  117. float transX = m[Matrix.MTRANS_X];
  118. float transY = m[Matrix.MTRANS_Y];
  119. float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
  120. float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale);
  121. if (fixTransX != 0 || fixTransY != 0)
  122. matrix.postTranslate(fixTransX, fixTransY);
  123. }
  124. float getFixTrans(float trans, float viewSize, float contentSize) {
  125. float minTrans, maxTrans;
  126. if (contentSize <= viewSize) {
  127. minTrans = 0;
  128. maxTrans = viewSize - contentSize;
  129. } else {
  130. minTrans = viewSize - contentSize;
  131. maxTrans = 0;
  132. }
  133. if (trans < minTrans)
  134. return -trans + minTrans;
  135. if (trans > maxTrans)
  136. return -trans + maxTrans;
  137. return 0;
  138. }
  139. float getFixDragTrans(float delta, float viewSize, float contentSize) {
  140. if (contentSize <= viewSize) {
  141. return 0;
  142. }
  143. return delta;
  144. }
  145. @Override
  146. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  147. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  148. viewWidth = MeasureSpec.getSize(widthMeasureSpec);
  149. viewHeight = MeasureSpec.getSize(heightMeasureSpec);
  150. //
  151. // Rescales image on rotation
  152. //
  153. if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
  154. || viewWidth == 0 || viewHeight == 0)
  155. return;
  156. oldMeasuredHeight = viewHeight;
  157. oldMeasuredWidth = viewWidth;
  158. if (saveScale == 1) {
  159. //Fit to screen.
  160. float scale;
  161. Drawable drawable = getDrawable();
  162. if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)
  163. return;
  164. int bmWidth = drawable.getIntrinsicWidth();
  165. int bmHeight = drawable.getIntrinsicHeight();
  166. Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);
  167. float scaleX = (float) viewWidth / (float) bmWidth;
  168. float scaleY = (float) viewHeight / (float) bmHeight;
  169. scale = Math.min(scaleX, scaleY);
  170. matrix.setScale(scale, scale);
  171. // Center the image
  172. float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);
  173. float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);
  174. redundantYSpace /= (float) 2;
  175. redundantXSpace /= (float) 2;
  176. matrix.postTranslate(redundantXSpace, redundantYSpace);
  177. origWidth = viewWidth - 2 * redundantXSpace;
  178. origHeight = viewHeight - 2 * redundantYSpace;
  179. setImageMatrix(matrix);
  180. }
  181. fixTrans();
  182. }
  183. }

然后在我们的Activity中就可以直接使用了:

[java] view plaincopy
  1. public class TouchImageViewActivity extends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. TouchImageView img = (TouchImageView) findViewById(R.id.snoop);
  8. img.setImageResource(R.drawable.snoopy);
  9. img.setMaxZoom(4f);
  10. }
  11. }

Android之实现手势缩放imageview中的图片相关推荐

  1. 将ImageVIew中的图片保存到本地相册中

    2019独角兽企业重金招聘Python工程师标准>>> 一:将ImageView中的图片转换成Bitmap 二:将Bitmap 转换成二进制,写入本地 三:用广播通知相册进行更新相册 ...

  2. [Android]ListView的Adapter.getView()方法中延迟加载图片的优化

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...

  3. 如何获取已加载在ImageView中的图片ID

    动机:程序的某个Activity中有一个ListView,ListView的每行视图中都有ImageView,程序初始化后,通过Adapter向ImageView中加载图片,现在的需求是,点击该图片能 ...

  4. Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...

  5. android拍照模糊,解决Android拍照并显示在ImageView中变模糊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public class ImageThumbnail { public static int reckonThumbnail(int oldWidth, ...

  6. android百度输入法表情符号,分析Android 搜狗输入法在微信和QQ中发送图片和表情...

    好记性不如烂笔头.生活中多做笔记,不仅可以方便自己,还可以方便他人. 背景 有没有发现,有时候表情或图片的交流更能让气氛更愉悦.斗图,成了群里的日常小事,然而,当你没有图可斗的时候就尴尬了.最近,搜狗 ...

  7. 分析Android 搜狗输入法在微信和QQ中发送图片和表情

    好记性不如烂笔头.生活中多做笔记,不仅可以方便自己,还可以方便他人. 背景 有没有发现,有时候表情或图片的交流更能让气氛更愉悦.斗图,成了群里的日常小事,然而,当你没有图可斗的时候就尴尬了.最近,搜狗 ...

  8. Android 保存图片到SQLite,读出SQLite中的图片

    转自:http://zhangfan822.iteye.com/blog/1883118 1.bitmap保存到SQLite 中 数据格式: Java代码   db.execSQL("Cre ...

  9. android 获取资源文件 r.drawable中的图片转换为drawable、bitmap

    1.R-Drawable 1 Resources resources = mContext.getResources(); 2 Drawable drawable = resources.getDra ...

最新文章

  1. 给一张表加一个自动编号字段_可视化仪表板快速入门教程,10分钟做一张销售分析仪表板...
  2. mysql 编译安装
  3. 51nod 1270 数组的最大代价 思路:简单动态规划
  4. Ueditor/自定义配置
  5. 哈希表(hashtable)的javascript简单实现
  6. BS前台能力迅速提高
  7. 关于汇编语言和IL的异同点
  8. 各种VS Code的学习秘诀,全是这六条法则撑起的!
  9. DIY激光雕刻机-结构设计
  10. Windows 之dos命令
  11. vr课设《梵高世界》第一人称的解谜游戏
  12. java随机生成6位流水号,Java生成随机流水号
  13. 电容触摸按键实验(STM32F407)
  14. nginx开启Gzip压缩
  15. 开发对接微信卡包会员卡_微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)...
  16. opencart seo优化_「opencart seo插件」wordpress SEO插件都有哪些好用的?...
  17. 使用 Entrust Lar…
  18. PHP是单线程还是多线程?
  19. 如何将ppt演示文稿上传到微信公众号?
  20. perror和strerror的使用和区别

热门文章

  1. node.js测试html tdd,nodejs的单元测试框架mocha
  2. python开发跟淘宝有关联微_基于Python的Apriori和FP-growth关联分析算法分析淘宝用户购物关联度...
  3. 六大QQ病毒的特征以及清除方法
  4. DevFest14 珠海 Wear 主题大会总结
  5. 用循环不停地输出2的倍数
  6. 图像处理;C++求已知两直线方程交点
  7. 仿写练习-京东商城导航条
  8. 在Matlab图片里输入数学公式、符号和希腊字母的方法
  9. javascript匿名函数的各种执行形式
  10. 新增Transformer优化!NVIDIA最新发布TensorRT 8!推理方面取得重大突破