博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android手势缩放图片以及图片黏贴在手指随手势移动
阅读量:6827 次
发布时间:2019-06-26

本文共 2284 字,大约阅读时间需要 7 分钟。

一个Android手势缩放图片的工具类;同时,此类还实现另外一个功能:当手指按在触屏上移动时候,图片“黏贴”在手指上随手指移动而整体移动。

具体使用方法可以是这样:先new一个此类的实例,然后在ImageView的方法setOnTouchListener(new ImageViewOnMultiTouchListener());

例如:

ImageViewOnMultiTouchListener listener=new ImageViewOnMultiTouchListener();		ImageView mImageView=(ImageView)findViewById(R.id.imageView);		mImageView.setOnTouchListener(listener);

ImageViewOnMultiTouchListener.java全部源代码:

public class ImageViewOnMultiTouchListener implements View.OnTouchListener {		private final int NONE = 0;		private final int MOVE = 1;		private final int ZOOM = 2;		private final int DRAG = 3;		private int mode = NONE;		private Matrix matrix = new Matrix();		private Matrix savedMatrix = new Matrix();		private PointF start = new PointF();		private PointF mid = new PointF();		private float oldDistance = 0;		@Override		public boolean onTouch(View v, MotionEvent event) {			ImageView view = (ImageView) v;			switch (event.getAction() & MotionEvent.ACTION_MASK) {			case MotionEvent.ACTION_DOWN:				matrix.set(view.getImageMatrix());				savedMatrix.set(matrix);				start.set(event.getX(), event.getY());				mode = DRAG;				break;			case MotionEvent.ACTION_POINTER_DOWN:				oldDistance = spacing(event);				if (oldDistance > 5f) {					savedMatrix.set(matrix);					midPoint(mid, event);					mode = ZOOM;				}				break;			case MotionEvent.ACTION_UP:			case MotionEvent.ACTION_POINTER_UP:				mode = NONE;				break;			case MotionEvent.ACTION_MOVE:				if (mode == DRAG) {					matrix.set(savedMatrix);					matrix.postTranslate(event.getX() - start.x, event.getY()							- start.y);				} else if (mode == ZOOM) {					float newDist = spacing(event);					if (newDist > 5f) {						matrix.set(savedMatrix);						float scale = newDist / oldDistance;						matrix.postScale(scale, scale, mid.x, mid.y);					}				}				break;			}			view.setImageMatrix(matrix);			view.setScaleType(ImageView.ScaleType.MATRIX);			view.setPadding(3, 5, 3, 5);			return true;		}		private float spacing(MotionEvent event) {			float x = event.getX(0) - event.getX(1);			float y = event.getY(0) - event.getY(1);			return FloatMath.sqrt(x * x + y * y);		}		private void midPoint(PointF point, MotionEvent event) {			float x = event.getX(0) + event.getX(1);			float y = event.getY(0) + event.getY(1);			point.set(x / 2, y / 2);		}	}



转载地址:http://veykl.baihongyu.com/

你可能感兴趣的文章
启动3个线程轮番打印递增的数字
查看>>
PHP FLUSH 函数 在IE11中 清除缓存的方法
查看>>
lvm相关知识
查看>>
[转] 《全唐诗》《全宋词》
查看>>
C Primer Plus (第五版) 第二章 编程练习
查看>>
安卓开发中Theme.AppCompat.Light的解决方法
查看>>
登入攻击不再是不可能!智能主动防御技术成主力防御部队
查看>>
12月18日任务 4 models基本使用 5 基本命令
查看>>
小程序开发之云函数中的时区问题
查看>>
OSChina 周日乱弹 —— 起来,不愿上班滴人们~
查看>>
OSChina 周三乱弹 —— 大家鉴定下面的这个姑娘优秀么
查看>>
Android Manifest.xml 结构详解
查看>>
Php-Web开发中浏览记录问题
查看>>
利用fake 在豆瓣小组 (半)自动化回帖功能
查看>>
jqxfileupload+springmvc上传资源
查看>>
如何解决ABBYY中区域未正确检测问题
查看>>
解决本地文件的词典翻译问题
查看>>
mongodb、3-基本的命令
查看>>
ubuntu pdf合并方法
查看>>
TCP网络编程流程
查看>>