Android拖动和缩放图片

Android拖动和缩放图片

2014年5月9日

我们在使用应用其中常常须要浏览图片。比方在微信其中。点击图片之后能够对图片进行缩放。

本博客介绍怎样对图片进行拖拽和缩放。这首先要了解Android中的触摸机制了,在屏幕中有手指按下、手指抬起、手指移动还有多个手指触摸的动作。

我们要实现对图片的拖拽和缩放就是要基于这些动作来进行逻辑处理。

图片的拖拽主要是计算手指開始的位置与当前手指的位置关系,来进行平移的,详细能够看代码。

图片的缩放就涉及到计算两点之间的距离来得到缩放比,调用矩阵方法来达到缩放的效果。

演示样例代码:http://download.csdn.net/detail/wwj_748/7324363

package com.wwj.dragscale;

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 wwj
 *
 */
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.imageView);
		imageView.setOnTouchListener(new TouchListener());
	}

	private class TouchListener implements OnTouchListener {

		private PointF startPoint = new PointF();
		private Matrix matrix = new Matrix();
		private Matrix currentMaritx = new Matrix();

		private int mode = 0; // 用于标记模式
		private static final int DRAG = 1; // 拖动
		private static final int ZOOM = 2; // 放大
		private float startDis = 0;
		private PointF midPoint; // 中心点

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			switch (event.getAction() & MotionEvent.ACTION_MASK) {
			case MotionEvent.ACTION_DOWN:
				mode = DRAG; // 拖拽
				currentMaritx.set(imageView.getImageMatrix()); // 记录ImageView当前移动位置
				startPoint.set(event.getX(), event.getY()); // 開始点
				break;
			case MotionEvent.ACTION_MOVE:// 移动事件
				if (mode == DRAG) { // 图片拖动事件
					float dx = event.getX() - startPoint.x; // x轴移动距离
					float dy = event.getY() - startPoint.y;
					matrix.set(currentMaritx); // 在当前的位置基础上移动
					matrix.postTranslate(dx, dy);
				} else if (mode == ZOOM) { // 图片放大事件
					float endDis = distance(event); // 结束距离
					if (endDis > 10f) {
						float scale = endDis / startDis; // 放大倍数
						matrix.set(currentMaritx);
						matrix.postScale(scale, scale, midPoint.x, midPoint.y);
					}

				}
				break;
			case MotionEvent.ACTION_UP:
				mode = 0;
				break;
			// 有手指离开屏幕,但屏幕还有触点(手指)
			case MotionEvent.ACTION_POINTER_UP:
				mode = 0;
				break;
			// 当屏幕上已经有触点(手指),再有一个手指压下屏幕
			case MotionEvent.ACTION_POINTER_DOWN:
				mode = ZOOM;
				startDis = distance(event);
				if (startDis > 10f) { // 避免手指上有两个
					midPoint = mid(event);
					currentMaritx.set(imageView.getImageMatrix()); // 记录当前的缩放倍数
				}
				break;
			}
			// 显示缩放后的图片
			imageView.setImageMatrix(matrix);
			return true;
		}

	}

	/**
	 * 计算两点之间的距离
	 *
	 * @param event
	 * @return
	 */
	public static 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);
	}

	/**
	 * 计算两点之间的中间点
	 *
	 * @param event
	 * @return
	 */
	public static PointF mid(MotionEvent event) {
		float midX = (event.getX(1) + event.getX(0)) / 2;
		float midY = (event.getY(1) + event.getY(0)) / 2;
		return new PointF(midX, midY);
	}

}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-12-20 08:01:25

Android拖动和缩放图片的相关文章

Android 等比例缩放图片

// 缩放图片 public static Bitmap zoomImg(String img, int newWidth ,int newHeight){ // 图片源 Bitmap bm = BitmapFactory.decodeFile(img); if(null!=bm){ return zoomImg(bm,newWidth,newHeight); } return null; } public static Bitmap zoomImg(Context context,String

Android多点触摸缩放图片-android学习之旅(四)

获取多触摸点 核心代码: 获取触摸点的个数和位置 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("down"); break; case MotionEvent.ACTION_UP: System.out.println("触摸点的个数:"+event.g

Android小应用----图片的拖动、缩放

public class MainActivity extends Activity { private ImageView operImage; private PointF point = new PointF();//记录手指的位置 private PointF midPoint = new PointF();//记录手指间的中点的位置 private Matrix matrix = new Matrix();//记录拖动和缩放前手指按下的matrix private Matrix new

一起学android之对资源图片进行比例缩放 (27)

效果图: 在平时加载图片时,我会使用SetImageBitmap.setImageResource.BitmapFactory.decodeResource来设置一张图 片通过以上方法来设置图片时,会通过Java层的createBitmap来完成,这样的话会消耗很多内存,容易导致 OOM(Out Of Memory),因此推荐使用BitmapFactory.Options这个类来设置一张资源图. 参看以下代码: public class MainActivity extends Activity

Android根据屏幕宽度,按比例缩放图片

原文链接:http://www.codeceo.com/article/android-zoom-image.html ImageView有scaleType属性可以缩放图片,让图片铺满屏幕宽度,但是会出现压缩或裁剪的情况. ImageView的scaleType的属性分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fitXY android:scaleType="center" 保持原图的大

【Android】21.4 图片动画缩放示例

分类:C#.Android.VS2015: 创建日期:2016-03-21 一.简介 该例子演示如何动画缩放图片,实现类似"点击看大图"的效果. 二.示例 1.运行截图    2.设计步骤 (1)添加图片 在Resources/no-dpi文件夹下添加4张图片(2个缩略图,2个大图). (2)添加ch2104MyImageButton.cs using Android.Content; using Android.Widget; using System.Drawing; using

Andorid-如何为你的Android应用缩放图片

很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件部门),让他分享一些关于这方面的经验. 注意:本文没有完整显示出代码示例.你可以下载本文的PDF,来看完整的代码示例. 在索尼爱立信软件部门工作,我经常遇到需要图片缩放的应用,例如:当处理别人或者网络上提供的图片.缩放是必要的,因为通常情况下的图片不是你想要呈现的那样. 典型的例子,如果你正在为你的应用开发

Android手势缩放图片以及图片黏贴在手指随手势移动

一个Android手势缩放图片的工具类:同时,此类还实现另外一个功能:当手指按在触屏上移动时候,图片"黏贴"在手指上随手指移动而整体移动. 具体使用方法可以是这样:先new一个此类的实例,然后在ImageView的方法setOnTouchListener(new ImageViewOnMultiTouchListener()); 例如: ImageViewOnMultiTouchListener listener=new ImageViewOnMultiTouchListener();

一些关于图片拖动,缩放、裁剪的文章

http://www.linuxidc.com/Linux/2014-12/110764.htm Android 自定义控件——图片剪裁 http://www.cnblogs.com/linjzong/p/4212474.html Android:手把手教你打造可缩放移动的ImageView(下) 调用android自带的图片裁剪 http://blog.csdn.net/androidzhaoxiaogang/article/details/8646471 http://mzh3344258.