Android多点触控 Matrix图片随意的放大缩小,拖动
一、新建一个项目AnroidImageDragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示:
二、设置应用的UI界面,在main.xml中设置:
三、MainActivity.java中实现具体的需求
package com.example.anroidimagedragandzoom; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; /** * 枚举方式实现事件 * @author miaowei * */ public class MainActivityEnum extends Activity{ private enum Type{ /** * 记录是拖放照片模式还是放大缩小照片模式 */ MODE, /** * 拖放照片模式 */ MODE_DRAG, /** * 放大缩小照片模式 */ MODE_ZOOM } private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView)findViewById(R.id.imageView); imageView.setOnTouchListener(touchListener); } private class MainEventEnmu extends EventInfoBase<Enum<?>>{ @Override public void setEvent(Enum<?> event) { super.setEvent(event); } } private OnTouchListener touchListener = new OnTouchListener() { /** * 用于记录开始时候的坐标位置 */ private PointF startPoint = new PointF(); /** * 用于记录拖拉图片移动的坐标位置 */ private Matrix matrix = new Matrix(); /** * 用于记录图片要进行拖拉时候的坐标位置 */ private Matrix currentMatrix = new Matrix(); /** * 两个手指的开始距离 */ private float startDis; /** * 两个手指的中间点 */ private PointF midPointF; MainEventEnmu mainEventEnmu = new MainEventEnmu(); @Override public boolean onTouch(View v, MotionEvent event) { //通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 switch (event.getAction() & MotionEvent.ACTION_MASK) { //手指压下屏幕 case MotionEvent.ACTION_DOWN: mainEventEnmu.setEvent(Type.MODE_DRAG); //记录ImageView当前的移动位置 currentMatrix.set(imageView.getImageMatrix()); startPoint.set(event.getX(), event.getY()); break; //手指在屏幕上移动,改事件会被不断触发 case MotionEvent.ACTION_MOVE: //拖拉图片 if (mainEventEnmu.getEvent() == Type.MODE_DRAG) { //得到X轴的移动距离 float dx = event.getX() - startPoint.x; //得到Y轴的移动距离 float dy = event.getY() - startPoint.y; //在没有移动之前的位置上进行移动 matrix.set(currentMatrix); matrix.postTranslate(dx, dy); } //放大缩小图片 else if (mainEventEnmu.getEvent() == Type.MODE_ZOOM) { //结束距离 float endDis = distance(event); // 两个手指并拢在一起的时候像素大于10 if (endDis > 10f) { // 得到缩放倍数 float scale = endDis / startDis; matrix.set(currentMatrix); matrix.postScale(scale, scale,midPointF.x,midPointF.y); } } break; // 手指离开屏幕 case MotionEvent.ACTION_UP: //当触点离开屏幕,但是屏幕上还有触点(手指),多点 case MotionEvent.ACTION_POINTER_UP: mainEventEnmu.setEvent(Type.MODE); break; // 当屏幕上已经有触点(手指),再有一个触点压下屏幕,多点 case MotionEvent.ACTION_POINTER_DOWN: mainEventEnmu.setEvent(Type.MODE_ZOOM); /** 计算两个手指间的距离 */ startDis = distance(event); // 两个手指并拢在一起的时候像素大于10 if (startDis > 10f) { midPointF = mid(event); //记录当前ImageView的缩放倍数 currentMatrix.set(imageView.getImageMatrix()); } break; } imageView.setImageMatrix(matrix); return true; } }; /** * 计算两个手指间的距离 * @param event * @return */ private float distance(MotionEvent event){ float dx = event.getX(1) - event.getX(0); float dy = event.getY(1) - event.getY(0); //使用勾股定理返回两点神之间的距离 return FloatMath.sqrt(dx * dx + dy * dy); } /** * 计算两个手指间的中间点 * @return */ private PointF mid(MotionEvent evntEvent){ float midX = (evntEvent.getX(1) + evntEvent.getX(0)); float midY = (evntEvent.getY(1) + evntEvent.getY(0)); return new PointF(midX, midY); } }
Activity需要实现一个OnTouchListener的方法,来设置ImageView的侦听属性,该接口位于android.view.View.OnTouchListener。
实现onTouch(View view, MotionEvent event)的方法,就可以获取触屏的感应事件了。
在该事件中,有两个参数可以用来获取对触摸的控制,这两个参数分别为:MotionEvent.getAction()和MotionEvent.ACTION_MASK,前者用于对单点触控进行操作,后者用于对多点触控进行操作,相应地,我们可以通过Android Developers’ Reference看到,对于单点触控,我们由MotionEvent.getAction()可以得到以下几种事件:ACTION_DOWN、ACTION_UP,而对于多点触控,由MotionEvent.ACTION_MASK,我们可以得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP,都是MotionEvent中的常量,可以直接调用。而有些常量则是单点和多点共用的,如:ACTION_MOVE,因此在按下时,我们必须标记单点与多点触控的区别。
附件中有采用枚举标识实现方式
相关推荐
本文将深入探讨如何在Android应用程序中实现图片的多点触控缩放功能。我们将讨论以下几个关键知识点: 1. **手势检测**: 在Android中,多点触控依赖于手势检测。我们可以通过监听MotionEvent事件来捕获用户的触摸...
综上所述,实现SurfaceView的多点触控移动放大缩小涉及到了Android的触摸事件处理、矩阵变换、多线程编程等多个知识点。通过理解并熟练运用这些技术,可以为用户提供流畅且响应迅速的交互体验。在实际开发中,可以...
总之,Android多点触控技术对于构建用户友好的交互式应用至关重要。通过理解和实践这个图片缩放和移动的示例,开发者可以更好地掌握如何在Android应用中实现复杂的触控交互,提升用户体验。同时,持续探索和研究...
在Android开发中,实现多点触控功能,如图片的拖拽、缩放和旋转,是提高用户体验的关键技术之一。本文将深入探讨如何在Android应用中实现这些特性,特别是针对多张图片的操作。 首先,我们需要了解Android中的触摸...
本文将深入探讨如何实现“Android图片多点放大缩小移动”这一功能,结合给定的描述和标签,我们将关注以下几个核心知识点: 1. **多点触控(Multi-Touch)**: 多点触控是指设备能够同时识别并处理两个或更多触摸...
在安卓平台上,手势识别和多点触控是用户...总之,“安卓手势放大图片,多点触控”是Android开发中的高级交互技术,它极大地提高了用户体验。通过理解和实践这些概念,开发者可以创建更加生动、直观的应用程序界面。
在IT领域,尤其是在移动应用开发中,多图片预览功能及图片多点触控是常见的需求,这使得用户能够互动地查看和操作图像。本文将深入探讨如何实现这些功能,包括图片自由缩放、双击缩放、图片自由移动以及与ViewPager...
在提供的文件"android图片多点触碰放大缩小.pdf"中,展示了一个名为`ImageZoomActivity`的Activity,它实现了对图片进行触摸拖动和双指缩放的操作。以下是对该实现的详细解释: 首先,类`ImageZoomActivity`继承自`...
这个压缩包文件“安卓Android源码——控件以及双指放大缩小图片、单指拖动图片.rar”显然提供了实现这些功能的源代码示例。下面将详细探讨这些关键知识点。 1. **手势识别**: - **多点触控(Multi-Touch)**:...
除了手动计算平移和缩放,Android还提供了ScaleGestureDetector和GestureDetector等工具类,它们可以帮助我们更方便地识别和处理多点触控手势,如捏合缩放和滑动平移。 在实际开发中,我们还需要考虑性能和用户体验...
在Android开发中,实现两点触摸即多点触控功能,常用于手势操作,如图片的放大和缩小。这里我们主要探讨如何通过自定义View来实现这个功能,这涉及到Android的MotionEvent类、触摸事件的分发以及 ...
在给定的标题“Android通过多点触控的方式对图片进行缩放的实例代码”和描述中,我们看到作者正在介绍如何在Android中添加一个能够通过多点触控进行缩放的图片视图。以下是对这一知识点的详细说明。 首先,我们需要...
双指放大缩小图片的功能主要依赖于多点触控(Multi-Touch)和手势识别。Android提供了`ScaleGestureDetector`类来帮助我们检测并处理缩放手势。当两个手指同时接触屏幕时,`ScaleGestureDetector`会计算它们之间的...
在这个窗口中,用户可以拖动和放大缩小图片。这种交互体验需要用到Android的触摸事件处理机制。开发者需要重写`onTouchEvent()`方法,解析ACTION_DOWN、ACTION_MOVE和ACTION_UP等事件,实现图片的平移和缩放功能。...
《ZoomImageView:深入解析图片浏览与多点触控技术》 在移动应用开发中,图片浏览功能是不可或缺的一部分,尤其在社交、电商、新闻等领域,用户对于图片的查看和交互有着高需求。ZoomImageView,正如其名,是专门...
总的来说,实现TextView的手势放大、拖动和旋转涉及到Android的多点触控处理和图形变换。通过巧妙地使用GestureDetector、ScaleGestureDetector(可能还有RotationGestureDetector)以及Matrix,我们可以为用户提供...
在这个场景中,我们关注的是自定义ImageView控件,它允许用户通过多点触控来缩放和拖动图片。以下是对该自定义组件实现的详细说明: 1. **自定义类MyImageView**:这个类继承自系统提供的ImageView,目的是扩展其...
在Android开发中,实现手指触控图片缩放是一项常见的需求,尤其在开发图像查看或编辑应用时。本文将详细介绍如何在Android中实现这一功能。 首先,我们要了解Android中处理手势的基本原理。Android提供了...