`

Android多点触控---Matrix图片随意的放大缩小,拖动

 
阅读更多

 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,因此在按下时,我们必须标记单点与多点触控的区别。

 

附件中有采用枚举标识实现方式

 

  • 大小: 22.9 KB
  • 大小: 49.9 KB
分享到:
评论

相关推荐

    Android 多点触控实例--图片的缩放

    本文将深入探讨如何在Android应用程序中实现图片的多点触控缩放功能。我们将讨论以下几个关键知识点: 1. **手势检测**: 在Android中,多点触控依赖于手势检测。我们可以通过监听MotionEvent事件来捕获用户的触摸...

    surfaceview 多点触控移动放大缩小

    综上所述,实现SurfaceView的多点触控移动放大缩小涉及到了Android的触摸事件处理、矩阵变换、多线程编程等多个知识点。通过理解并熟练运用这些技术,可以为用户提供流畅且响应迅速的交互体验。在实际开发中,可以...

    Android多点触控技术实战,对图片进行缩放和移动Demo

    总之,Android多点触控技术对于构建用户友好的交互式应用至关重要。通过理解和实践这个图片缩放和移动的示例,开发者可以更好地掌握如何在Android应用中实现复杂的触控交互,提升用户体验。同时,持续探索和研究...

    Android 多点触控,多张图片拖拽,缩放,旋转

    在Android开发中,实现多点触控功能,如图片的拖拽、缩放和旋转,是提高用户体验的关键技术之一。本文将深入探讨如何在Android应用中实现这些特性,特别是针对多张图片的操作。 首先,我们需要了解Android中的触摸...

    android 图片多点放大缩小移动

    本文将深入探讨如何实现“Android图片多点放大缩小移动”这一功能,结合给定的描述和标签,我们将关注以下几个核心知识点: 1. **多点触控(Multi-Touch)**: 多点触控是指设备能够同时识别并处理两个或更多触摸...

    安卓手势放大图片多点触控缩放图片

    在安卓平台上,手势识别和多点触控是用户...总之,“安卓手势放大图片,多点触控”是Android开发中的高级交互技术,它极大地提高了用户体验。通过理解和实践这些概念,开发者可以创建更加生动、直观的应用程序界面。

    多图片预览功能以及图片多点触控(缩放,双击,拖动)

    在IT领域,尤其是在移动应用开发中,多图片预览功能及图片多点触控是常见的需求,这使得用户能够互动地查看和操作图像。本文将深入探讨如何实现这些功能,包括图片自由缩放、双击缩放、图片自由移动以及与ViewPager...

    android图片多点触碰放大缩小.pdf

    在提供的文件"android图片多点触碰放大缩小.pdf"中,展示了一个名为`ImageZoomActivity`的Activity,它实现了对图片进行触摸拖动和双指缩放的操作。以下是对该实现的详细解释: 首先,类`ImageZoomActivity`继承自`...

    安卓Android源码——控件以及双指放大缩小图片、单指拖动图片.rar

    这个压缩包文件“安卓Android源码——控件以及双指放大缩小图片、单指拖动图片.rar”显然提供了实现这些功能的源代码示例。下面将详细探讨这些关键知识点。 1. **手势识别**: - **多点触控(Multi-Touch)**:...

    Android Matrix处理ImageView中图片缩放,平移

    除了手动计算平移和缩放,Android还提供了ScaleGestureDetector和GestureDetector等工具类,它们可以帮助我们更方便地识别和处理多点触控手势,如捏合缩放和滑动平移。 在实际开发中,我们还需要考虑性能和用户体验...

    android 两点触摸 两个手指放大缩小图片

    在Android开发中,实现两点触摸即多点触控功能,常用于手势操作,如图片的放大和缩小。这里我们主要探讨如何通过自定义View来实现这个功能,这涉及到Android的MotionEvent类、触摸事件的分发以及 ...

    Android通过多点触控的方式对图片进行缩放的实例代码

    在给定的标题“Android通过多点触控的方式对图片进行缩放的实例代码”和描述中,我们看到作者正在介绍如何在Android中添加一个能够通过多点触控进行缩放的图片视图。以下是对这一知识点的详细说明。 首先,我们需要...

    控件以及双指放大缩小图片、单指拖动图片.zip

    双指放大缩小图片的功能主要依赖于多点触控(Multi-Touch)和手势识别。Android提供了`ScaleGestureDetector`类来帮助我们检测并处理缩放手势。当两个手指同时接触屏幕时,`ScaleGestureDetector`会计算它们之间的...

    三维Gallery

    在这个窗口中,用户可以拖动和放大缩小图片。这种交互体验需要用到Android的触摸事件处理机制。开发者需要重写`onTouchEvent()`方法,解析ACTION_DOWN、ACTION_MOVE和ACTION_UP等事件,实现图片的平移和缩放功能。...

    zoomImageView:图片浏览,多点触控、双击缩放

    《ZoomImageView:深入解析图片浏览与多点触控技术》 在移动应用开发中,图片浏览功能是不可或缺的一部分,尤其在社交、电商、新闻等领域,用户对于图片的查看和交互有着高需求。ZoomImageView,正如其名,是专门...

    textview 手势放大拖动旋转

    总的来说,实现TextView的手势放大、拖动和旋转涉及到Android的多点触控处理和图形变换。通过巧妙地使用GestureDetector、ScaleGestureDetector(可能还有RotationGestureDetector)以及Matrix,我们可以为用户提供...

    Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码

    在这个场景中,我们关注的是自定义ImageView控件,它允许用户通过多点触控来缩放和拖动图片。以下是对该自定义组件实现的详细说明: 1. **自定义类MyImageView**:这个类继承自系统提供的ImageView,目的是扩展其...

    Android实现手指触控图片缩放功能

    在Android开发中,实现手指触控图片缩放是一项常见的需求,尤其在开发图像查看或编辑应用时。本文将详细介绍如何在Android中实现这一功能。 首先,我们要了解Android中处理手势的基本原理。Android提供了...

Global site tag (gtag.js) - Google Analytics