Android之实现手势缩放imageview中的图片
转自: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代码:
- public class MulitPointTouchListener implements OnTouchListener {
- private static final String TAG = "Touch";
- // These matrices will be used to move and zoom image
- Matrix matrix = new Matrix();
- Matrix savedMatrix = new Matrix();
- // We can be in one of these 3 states
- static final int NONE = 0;
- static final int DRAG = 1;
- static final int ZOOM = 2;
- int mode = NONE;
- // Remember some things for zooming
- PointF start = new PointF();
- PointF mid = new PointF();
- float oldDist = 1f;
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- ImageView view = (ImageView) v;
- // Log.e("view_width",
- // view.getImageMatrix()..toString()+"*"+v.getWidth());
- // Dump touch event to log
- dumpEvent(event);
- // Handle touch events here...
- switch (event.getAction() & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN:
- matrix.set(view.getImageMatrix());
- savedMatrix.set(matrix);
- start.set(event.getX(), event.getY());
- //Log.d(TAG, "mode=DRAG");
- mode = DRAG;
- //Log.d(TAG, "mode=NONE");
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- oldDist = spacing(event);
- //Log.d(TAG, "oldDist=" + oldDist);
- if (oldDist > 10f) {
- savedMatrix.set(matrix);
- midPoint(mid, event);
- mode = ZOOM;
- //Log.d(TAG, "mode=ZOOM");
- }
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_POINTER_UP:
- mode = NONE;
- //Log.e("view.getWidth", view.getWidth() + "");
- //Log.e("view.getHeight", view.getHeight() + "");
- 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);
- //Log.d(TAG, "newDist=" + newDist);
- if (newDist > 10f) {
- matrix.set(savedMatrix);
- float scale = newDist / oldDist;
- matrix.postScale(scale, scale, mid.x, mid.y);
- }
- }
- break;
- }
- view.setImageMatrix(matrix);
- return true; // indicate event was handled
- }
- private void dumpEvent(MotionEvent event) {
- String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
- "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
- StringBuilder sb = new StringBuilder();
- int action = event.getAction();
- int actionCode = action & MotionEvent.ACTION_MASK;
- sb.append("event ACTION_").append(names[actionCode]);
- if (actionCode == MotionEvent.ACTION_POINTER_DOWN
- || actionCode == MotionEvent.ACTION_POINTER_UP) {
- sb.append("(pid ").append(
- action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
- sb.append(")");
- }
- sb.append("[");
- for (int i = 0; i < event.getPointerCount(); i++) {
- sb.append("#").append(i);
- sb.append("(pid ").append(event.getPointerId(i));
- sb.append(")=").append((int) event.getX(i));
- sb.append(",").append((int) event.getY(i));
- if (i + 1 < event.getPointerCount())
- sb.append(";");
- }
- sb.append("]");
- //Log.d(TAG, sb.toString());
- }
- 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);
- }
- }
方法二:自定义一个ImageView,例如TouchImageView:
- import android.content.Context;
- import android.graphics.Matrix;
- import android.graphics.PointF;
- import android.graphics.drawable.Drawable;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.ScaleGestureDetector;
- import android.view.View;
- import android.widget.ImageView;
- public class TouchImageView extends ImageView {
- Matrix matrix;
- // We can be in one of these 3 states
- static final int NONE = 0;
- static final int DRAG = 1;
- static final int ZOOM = 2;
- int mode = NONE;
- // Remember some things for zooming
- PointF last = new PointF();
- PointF start = new PointF();
- float minScale = 1f;
- float maxScale = 3f;
- float[] m;
- int viewWidth, viewHeight;
- static final int CLICK = 3;
- float saveScale = 1f;
- protected float origWidth, origHeight;
- int oldMeasuredWidth, oldMeasuredHeight;
- ScaleGestureDetector mScaleDetector;
- Context context;
- public TouchImageView(Context context) {
- super(context);
- sharedConstructing(context);
- }
- public TouchImageView(Context context, AttributeSet attrs) {
- super(context, attrs);
- sharedConstructing(context);
- }
- private void sharedConstructing(Context context) {
- super.setClickable(true);
- this.context = context;
- mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
- matrix = new Matrix();
- m = new float[9];
- setImageMatrix(matrix);
- setScaleType(ScaleType.MATRIX);
- setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- mScaleDetector.onTouchEvent(event);
- PointF curr = new PointF(event.getX(), event.getY());
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- last.set(curr);
- start.set(last);
- mode = DRAG;
- break;
- case MotionEvent.ACTION_MOVE:
- if (mode == DRAG) {
- float deltaX = curr.x - last.x;
- float deltaY = curr.y - last.y;
- float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale);
- float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale);
- matrix.postTranslate(fixTransX, fixTransY);
- fixTrans();
- last.set(curr.x, curr.y);
- }
- break;
- case MotionEvent.ACTION_UP:
- mode = NONE;
- int xDiff = (int) Math.abs(curr.x - start.x);
- int yDiff = (int) Math.abs(curr.y - start.y);
- if (xDiff < CLICK && yDiff < CLICK)
- performClick();
- break;
- case MotionEvent.ACTION_POINTER_UP:
- mode = NONE;
- break;
- }
- setImageMatrix(matrix);
- invalidate();
- return true; // indicate event was handled
- }
- });
- }
- public void setMaxZoom(float x) {
- maxScale = x;
- }
- private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
- @Override
- public boolean onScaleBegin(ScaleGestureDetector detector) {
- mode = ZOOM;
- return true;
- }
- @Override
- public boolean onScale(ScaleGestureDetector detector) {
- float mScaleFactor = detector.getScaleFactor();
- float origScale = saveScale;
- saveScale *= mScaleFactor;
- if (saveScale > maxScale) {
- saveScale = maxScale;
- mScaleFactor = maxScale / origScale;
- } else if (saveScale < minScale) {
- saveScale = minScale;
- mScaleFactor = minScale / origScale;
- }
- if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight)
- matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2);
- else
- matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
- fixTrans();
- return true;
- }
- }
- void fixTrans() {
- matrix.getValues(m);
- float transX = m[Matrix.MTRANS_X];
- float transY = m[Matrix.MTRANS_Y];
- float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
- float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale);
- if (fixTransX != 0 || fixTransY != 0)
- matrix.postTranslate(fixTransX, fixTransY);
- }
- float getFixTrans(float trans, float viewSize, float contentSize) {
- float minTrans, maxTrans;
- if (contentSize <= viewSize) {
- minTrans = 0;
- maxTrans = viewSize - contentSize;
- } else {
- minTrans = viewSize - contentSize;
- maxTrans = 0;
- }
- if (trans < minTrans)
- return -trans + minTrans;
- if (trans > maxTrans)
- return -trans + maxTrans;
- return 0;
- }
- float getFixDragTrans(float delta, float viewSize, float contentSize) {
- if (contentSize <= viewSize) {
- return 0;
- }
- return delta;
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- viewWidth = MeasureSpec.getSize(widthMeasureSpec);
- viewHeight = MeasureSpec.getSize(heightMeasureSpec);
- //
- // Rescales image on rotation
- //
- if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
- || viewWidth == 0 || viewHeight == 0)
- return;
- oldMeasuredHeight = viewHeight;
- oldMeasuredWidth = viewWidth;
- if (saveScale == 1) {
- //Fit to screen.
- float scale;
- Drawable drawable = getDrawable();
- if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)
- return;
- int bmWidth = drawable.getIntrinsicWidth();
- int bmHeight = drawable.getIntrinsicHeight();
- Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);
- float scaleX = (float) viewWidth / (float) bmWidth;
- float scaleY = (float) viewHeight / (float) bmHeight;
- scale = Math.min(scaleX, scaleY);
- matrix.setScale(scale, scale);
- // Center the image
- float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);
- float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);
- redundantYSpace /= (float) 2;
- redundantXSpace /= (float) 2;
- matrix.postTranslate(redundantXSpace, redundantYSpace);
- origWidth = viewWidth - 2 * redundantXSpace;
- origHeight = viewHeight - 2 * redundantYSpace;
- setImageMatrix(matrix);
- }
- fixTrans();
- }
- }
然后在我们的Activity中就可以直接使用了:
- public class TouchImageViewActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- TouchImageView img = (TouchImageView) findViewById(R.id.snoop);
- img.setImageResource(R.drawable.snoopy);
- img.setMaxZoom(4f);
- }
- }
Android之实现手势缩放imageview中的图片相关推荐
- 将ImageVIew中的图片保存到本地相册中
2019独角兽企业重金招聘Python工程师标准>>> 一:将ImageView中的图片转换成Bitmap 二:将Bitmap 转换成二进制,写入本地 三:用广播通知相册进行更新相册 ...
- [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...
- 如何获取已加载在ImageView中的图片ID
动机:程序的某个Activity中有一个ListView,ListView的每行视图中都有ImageView,程序初始化后,通过Adapter向ImageView中加载图片,现在的需求是,点击该图片能 ...
- Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...
- android拍照模糊,解决Android拍照并显示在ImageView中变模糊
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public class ImageThumbnail { public static int reckonThumbnail(int oldWidth, ...
- android百度输入法表情符号,分析Android 搜狗输入法在微信和QQ中发送图片和表情...
好记性不如烂笔头.生活中多做笔记,不仅可以方便自己,还可以方便他人. 背景 有没有发现,有时候表情或图片的交流更能让气氛更愉悦.斗图,成了群里的日常小事,然而,当你没有图可斗的时候就尴尬了.最近,搜狗 ...
- 分析Android 搜狗输入法在微信和QQ中发送图片和表情
好记性不如烂笔头.生活中多做笔记,不仅可以方便自己,还可以方便他人. 背景 有没有发现,有时候表情或图片的交流更能让气氛更愉悦.斗图,成了群里的日常小事,然而,当你没有图可斗的时候就尴尬了.最近,搜狗 ...
- Android 保存图片到SQLite,读出SQLite中的图片
转自:http://zhangfan822.iteye.com/blog/1883118 1.bitmap保存到SQLite 中 数据格式: Java代码 db.execSQL("Cre ...
- android 获取资源文件 r.drawable中的图片转换为drawable、bitmap
1.R-Drawable 1 Resources resources = mContext.getResources(); 2 Drawable drawable = resources.getDra ...
最新文章
- 给一张表加一个自动编号字段_可视化仪表板快速入门教程,10分钟做一张销售分析仪表板...
- mysql 编译安装
- 51nod 1270 数组的最大代价 思路:简单动态规划
- Ueditor/自定义配置
- 哈希表(hashtable)的javascript简单实现
- BS前台能力迅速提高
- 关于汇编语言和IL的异同点
- 各种VS Code的学习秘诀,全是这六条法则撑起的!
- DIY激光雕刻机-结构设计
- Windows 之dos命令
- vr课设《梵高世界》第一人称的解谜游戏
- java随机生成6位流水号,Java生成随机流水号
- 电容触摸按键实验(STM32F407)
- nginx开启Gzip压缩
- 开发对接微信卡包会员卡_微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)...
- opencart seo优化_「opencart seo插件」wordpress SEO插件都有哪些好用的?...
- 使用 Entrust Lar…
- PHP是单线程还是多线程?
- 如何将ppt演示文稿上传到微信公众号?
- perror和strerror的使用和区别
热门文章
- node.js测试html tdd,nodejs的单元测试框架mocha
- python开发跟淘宝有关联微_基于Python的Apriori和FP-growth关联分析算法分析淘宝用户购物关联度...
- 六大QQ病毒的特征以及清除方法
- DevFest14 珠海 Wear 主题大会总结
- 用循环不停地输出2的倍数
- 图像处理;C++求已知两直线方程交点
- 仿写练习-京东商城导航条
- 在Matlab图片里输入数学公式、符号和希腊字母的方法
- javascript匿名函数的各种执行形式
- 新增Transformer优化!NVIDIA最新发布TensorRT 8!推理方面取得重大突破