Android多点触控缩放拖拽实例

在Android上查看图片或者浏览网页时,我们往往有把图片或者网页放大或者缩小的的需求,这样就能够获得更多的细节信息

或者获得更多的全貌信息,多点触摸与绽放功能正是满足这种应用场景的技术。

下面通过一个例子来学习实现图片的拖拉功能:

程序运行示意图:1.初始化界面  2.为缩小的界面  3.为放大的界面

       
  

新建一个名称为DragAndDrop的Android工程,目录结构如下:

主界面的activity_layout.xml的布局代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ImageView
        android:id="@+id/show_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="matrix"
        android:src="@drawable/s001"
        android:background="#ff0000"
        android:contentDescription="@string/app_name"/>

</RelativeLayout>

读者需要注意的是我们的ImageView的控制方式设置成了matrix这样就可以在代码中非常方便的对图片进行控制了。

我们把一张图片(大小超过手机屏幕)的图片放在drawable-mdpi文件中。

图片资源如下:

MainActivity.java的代码如下:

package com.shen.draganddrop;

import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView  imageView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView = (ImageView) findViewById(R.id.show_img);
		imageView.setOnTouchListener(new ImageTouchListener());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	private class ImageTouchListener implements OnTouchListener
	{

		//声明一个坐标点
		private PointF startPoint;
		//声明并实例化一个Matrix来控制图片
		private Matrix matrix = new Matrix();
		//声明并实例化当前图片的Matrix
		private Matrix mCurrentMatrix = new Matrix();

		//缩放时初始的距离
		private float startDistance;
		//拖拉的标记
		private static final int DRAG = 1;
		//缩放的标记
		private static final int ZOOM = 2;
		//标识记录
		private int mode;
		//缩放的中间点
		private PointF midPoint;

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			switch (event.getAction()&MotionEvent.ACTION_MASK) {
			case MotionEvent.ACTION_DOWN:
				System.out.println("ACTION_DOWN");
				Log.w("Drag", "ACTION_DOWN");
				//此时处于拖拉方式下
				mode = DRAG;
				//获得当前按下点的坐标
				startPoint = new PointF(event.getX(),event.getY());
				//把当前图片的Matrix设置为按下图片的Matrix
				mCurrentMatrix.set(imageView.getImageMatrix());
				break;
			case MotionEvent.ACTION_MOVE:
				Log.w("Drag", "ACTION_MOVE");
				//根据不同的模式执行相应的缩放或者拖拉操作
				switch (mode) {
				case DRAG:
					//移动的x坐标的距离
					float dx = event.getX() - startPoint.x;
					//移动的y坐标的距离
					float dy = event.getY() - startPoint.y;
					//设置Matrix当前的matrix
					matrix.set(mCurrentMatrix);
					//告诉matrix要移动的x轴和Y轴的距离
					matrix.postTranslate(dx, dy);
					break;
				case ZOOM:
					//计算缩放的距离
					float endDistance = distance(event);
					//计算缩放比率
					float scale = endDistance / startDistance;
					//设置当前的Matrix
					matrix.set(mCurrentMatrix);
					//设置缩放的参数
					matrix.postScale(scale, scale, midPoint.x, midPoint.y);
					break;
				default:
					break;
				}

				break;
			//已经有一个手指按住屏幕,再有一个手指按下屏幕就会触发该事件
			case MotionEvent.ACTION_POINTER_DOWN:
				Log.w("Drag", "ACTION_POINTER_DOWN");
				//此时为缩放模式
				mode = ZOOM;
				//计算开始时两个点的距离
				startDistance = distance(event);
				//当两个点的距离大于10时才进行缩放操作
				if(startDistance > 10)
				{
					//计算中间点
					midPoint = mid(event);
					//得到进行缩放操作之前,照片的绽放倍数
					mCurrentMatrix.set(imageView.getImageMatrix());
				}
				break;
			//已经有一个手指离开屏幕,还有手指在屏幕上时就会触发该事件
			case MotionEvent.ACTION_POINTER_UP:
				Log.w("Drag", "ACTION_POINTER_UP");
				mode = 0;
				break;
			case MotionEvent.ACTION_UP:
				Log.w("Drag", "ACTION_UP");
				mode = 0;
				break;
			default:
				break;
			}
			//按照Matrix的要求移动图片到某一个位置
			imageView.setImageMatrix(matrix);
			//返回true表明我们会消费该动作,不需要父控件进行进一步的处理
			return true;
		}

	}

	public static float distance(MotionEvent event)
	{
		float dx = event.getX(1) - event.getX(0);
		float dy = event.getY(1) - event.getY(0);

		return (float) Math.sqrt(dx*dx + dy*dy);
	}

	public static PointF mid(MotionEvent event)
	{
		float x = (event.getX(1) - event.getX(0)) /2;
		float y = (event.getY(1) - event.getY(0)) /2;
		return new PointF(x,y);
	}
}

代码中都有注释在此就不详述了!

程序源码下载

http://download.csdn.net/detail/cqtddt/8308631

时间: 2024-08-05 15:13:01

Android多点触控缩放拖拽实例的相关文章

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

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的.因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放. 如果你还没有看过 Android瀑布流照片墙实现,体验不规则排列的美感

Android多点触控(图片的缩放Demo)

本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.需要实现OnTouchListener接口,重写其中的onTouch方法. 实现效果图: 源代码: 布局文件: activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&quo

Android多点触控技术

1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放.手势操作上有更好的用户体验. 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN,而移动操作时为 ACTION_MOVE,最终放开手指时触发ACTION_UP事件.当然还有用户无规则的操作可能触发ACTION_CAN

关于android多点触控

最近项目需要一个多点触控缩放的功能.然后上网查了下资料 总结一下: 首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion="4"  并且建工程的时候选的是android 2.2就表示你的应用兼容android1.6~android2.2 之间的版本.但是多点触控的API在1.6~~2,1~~,2,2~~三个版本中都是不一样的.比如android2.2中onTouchEvent(MotionEvent eve

android 多点触控

多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法: getPointerCount() 获得触屏的点数. getPointerId(int pointerIndex) 返回一个触摸点的标示,pointIndex是你第几个触控点的索引 getX() 获得触屏的X坐标值 getY() 获得触屏的Y坐标值 getAction()

Android 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)

最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.ui java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nat

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能,这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements

Android多点触控MultiTouch浅析

申明: 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0226/914.html 下面实现如何通过应用层支持多点触控操作,对于常规的控件触控操实现onTouchEvent()方法来处理.同时对onTouchEvent方法的参数MotionEvent进行一些了解. 正文: 下面会用两个应用示例来初步学习一下Android中的多点触控. 示例一(DemoMultiTouch-Canvas): 核心技术介绍 本示例是在Sur

android多点触控自由对图片缩放

在系统的相册中,观看相片就可以用多个手指进行缩放. 要实现这个功能,只需要这几步: 1.新建项目,在项目中新建一个ZoomImage.java public class ZoomImageView extends View { //初始化状态常量 public static final int STATUS_INIT=1; //图片放大状态常量 public static final int STATUS_ZOOM_OUT=2; //图片缩小状态常量 public static final in