`

通过自定义ImageView来实现多点触控

 
阅读更多
public class Main extends Activity {
	private MyImageView imageView;// 声明一个自定义的ImageView
	private Bitmap bitmap;
	// 两点触屏后之间的长度
	private float beforeLenght;
	private float afterLenght;
	TextView mtxtNext;
	// 单点移动的前后坐标值
	private float afterX, afterY;
	private float beforeX, beforeY;
	Button btn1;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		imageView = new MyImageView(this);
		bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.mm))
				.getBitmap();// 得到图片
		setContentView(R.layout.main);
		setContentView(imageView);

		// 设置imageView的显示图片
		imageView.setImageBitmap(bitmap);
		// 设置图片填充ImageView
		imageView.setScaleType(ScaleType.FIT_XY);
	}

	// 触屏事件
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getY() > imageView.getTop()
				&& event.getY() < imageView.getBottom()
				&& event.getX() > imageView.getLeft()
				&& event.getX() < imageView.getRight()) //
		{// 判定用户是否触摸到了图片
			if (event.getPointerCount() == 2) {// 2点触控
				imageView.scaleWithFinger(event);// 调用控制图片大小的方法
			} else if (event.getPointerCount() == 1) {// 单点触摸
				imageView.moveWithFinger(event);// 调用控制图片移动的方法
			}
		}
		return true;
	}

	/**
	 * 自定义ImageView类
		 */
	class MyImageView extends ImageView {
		private float scale = 0.1f;

		public MyImageView(Context context) {
			super(context);
		}

		// 用来设置ImageView的位置
		private void setLocation(int x, int y) {
			this.setFrame(//
					this.getLeft() + x, //
					this.getTop() + y, //
					this.getRight() + x, //
					this.getBottom() + y);//
		}

		// 用来放大缩小ImageView 因为图片是填充ImageView的,所以也就有放大缩小图片的效果
		private void setScale(float temp, int flag) {
			if (flag == 0) {// 放大图片
				this.setFrame(//
						this.getLeft() - (int) (temp * this.getWidth()),//
						this.getTop() - (int) (temp * this.getHeight()), //
						this.getRight() + (int) (temp * this.getWidth()), //
						this.getBottom() + (int) (temp * this.getHeight()));//
			} else {// 缩小图片
				this.setFrame(//
						this.getLeft() + (int) (temp * this.getWidth()),//
						this.getTop() + (int) (temp * this.getHeight()),//
						this.getRight() - (int) (temp * this.getWidth()), //
						this.getBottom() - (int) (temp * this.getHeight()));//
			}
		}

		// 绘制边框
		@Override
		protected void onDraw(Canvas canvas) {
			super.onDraw(canvas);
			Rect rect = canvas.getClipBounds();
			rect.bottom--;
			rect.right--;
			Paint paint = new Paint();
			paint.setColor(Color.BLACK);
			paint.setStyle(Paint.Style.STROKE);
			canvas.drawRect(rect, paint);
		}

		/*
		 * 让图片跟随手指触屏的位置移动 beforeX、Y是用来保存前一位置的坐标 afterX、Y是用来保存当前位置的坐标
		 * 它们的差值就是ImageView各坐标的增加或减少值
		 */
		public void moveWithFinger(MotionEvent event) {
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				beforeX = event.getX();
				beforeY = event.getY();
				break;
			case MotionEvent.ACTION_MOVE:
				afterX = event.getX();
				afterY = event.getY();
				this.setLocation((int) (afterX - beforeX),
						(int) (afterY - beforeY));
				beforeX = afterX;
				beforeY = afterY;
				break;
			case MotionEvent.ACTION_UP:
				break;
			}
		}

		// 通过多点触屏放大或缩小图像 beforeLenght用来保存前一时间两点之间的距离 afterLenght用来保存当前时间两点之间的距离
		public void scaleWithFinger(MotionEvent event) {
			float X = event.getX(1) - event.getX(0);
			float Y = event.getY(1) - event.getY(0);
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				beforeLenght = (float) Math.sqrt((X * X) + (Y * Y));
				break;
			case MotionEvent.ACTION_MOVE:
				afterLenght = (float) Math.sqrt((X * X) + (Y * Y));// 得到两个点之间的长度
				float gapLenght = afterLenght - beforeLenght;
				if (gapLenght == 0) {
					break;
				}
				// 如果当前时间两点距离大于前一时间两点距离,则传0,否则传1
				if (gapLenght > 0) {
					this.setScale(scale, 0);
				} else {
					this.setScale(scale, 1);
				}
				beforeLenght = afterLenght;
				break;
			}
		}
	}

}

 

分享到:
评论

相关推荐

    自定义ImageView实现多点触控源码

    在Android中,多点触控是通过`MotionEvent`类来处理的,该类提供了对触摸事件的管理。我们可以通过检测`ACTION_DOWN`、`ACTION_POINTER_DOWN`、`ACTION_MOVE`和`ACTION_UP`等动作来跟踪多个触摸点。特别是`ACTION_...

    基于ImageView的多点触控,双击放大缩小以及结合ViewPager的事件冲突

    总之,实现基于ImageView的多点触控、双击缩放和自由移动,以及在与ViewPager结合时处理事件冲突,是提升用户交互体验的关键。通过自定义控件和巧妙的事件处理,开发者可以创建出更加灵活和用户友好的图像查看组件。

    多点触控缩放图片

    通过分析和学习这个示例,开发者能够更好地理解和掌握在Android中实现多点触控缩放图片的技巧。 总的来说,多点触控缩放图片是Android应用开发中一个重要的交互设计。通过理解Android的手势处理机制、运用Matrix...

    多点触控 图片的缩放

    本文将深入探讨如何实现对指定图片的多点触控缩放功能,以及如何利用gallery容器来存储和展示多张图片。 一、多点触控基础 多点触控(Multi-Touch)是指通过两个或更多个触点同时与屏幕进行交互的技术。在Android和...

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

    在"PhotoWallFallsDemo"中,我们可能需要创建一个自定义的ImageView或者使用GestureDetector和ScaleGestureDetector来处理多点触控事件。GestureDetector用于处理简单的单点触控,如点击和滑动;而...

    PhotoWallFallsDemo多点触控.zip

    本示例“PhotoWallFallsDemo多点触控”正是一个专注于提升用户体验的项目,它实现了对ImageView的自定义控制,允许用户通过多点触控来对图片进行缩放和拖动操作。这一功能对于创建照片墙、画廊应用或者任何需要用户...

    最简单android 多点触控 图片放大

    在自定义ImageView中,我们需要维护两个触点的位置,通过比较它们之间的距离来判断是缩放还是平移操作。如果是缩放,可以通过设置图片的ScaleType和Matrix来改变图片的大小。例如: ```java @Override public ...

    安卓多点触控手势操作相关-图片多点触控功能的实现特别好用能够减少很多时间。原理是手势识别和边界控制.rar

    在实现图片多点触控功能时,我们通常会创建一个自定义的ImageView子类,以便重写其onTouchEvent()方法。在这个方法中,我们需要捕获和解析MotionEvent事件,以识别出用户的缩放、旋转和拖动等手势。 1. **缩放手势...

    Android程序研发源码Android 多点触控实例源码.rar

    在Android开发中,多点触控(Multi-Touch)是一项重要的功能,它允许用户通过同时操作两个或更多个触控点来与应用进行交互。在本实例中,"Android程序研发源码Android 多点触控实例源码.rar" 提供了一个关于如何实现...

    自定义ImageView(可单点缩放回弹、拖拽、多点缩放)

    4. **多点触控缩放**: 多点触控缩放允许用户通过两个或更多手指来同时缩放图片。这涉及到ACTION_POINTER_DOWN和ACTION_POINTER_UP事件的处理,以及找出所有活跃的手指中最近的两个,计算它们之间的中心点,以此作为...

    图片多点触控伸缩变换位置

    本文将详细解析"图片多点触控伸缩变换位置"这一主题,帮助你理解如何通过编程实现这个功能。 首先,我们要知道多点触控(Multi-Touch)是指能够同时识别和处理两个或更多触摸输入点的技术。这种技术允许用户通过多...

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

    概述:通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放。 /** * 自定义的ImageView控制,可对图片进行多点触控缩放和拖动 * * @author qiuwanyong */ public class MyImageView extends ...

    Android 多点触控实例

    在本实例中,我们将深入探讨如何实现一个能够根据用户手势自由放大和缩小图像的多点触控功能。 一、Android多点触控基础 1. MotionEvent类:在Android中,`MotionEvent`类是用于表示触摸屏幕事件的核心类。它包含...

    安卓多点触控手势操作相关-通过手势实现的缩放处理.rar

    在安卓开发中,多点触控手势...总之,通过理解和实践这个压缩包中的资源,开发者可以掌握如何在Android应用中实现多点触控手势,尤其是缩放功能。这将有助于提升应用的用户体验,让用户能够更加自如地与应用内容互动。

    android多点触控 两指缩放的demo

    总的来说,这个“android多点触控 两指缩放的demo”是一个很好的起点,它展示了如何利用Android的MotionEvent和自定义View来实现多点触控功能。开发者可以通过这个示例深入理解Android的触摸事件处理,以及如何将...

    Android源码——多点触控实例源码.zip

    总的来说,这个实例源码提供了一个实现Android多点触控功能的基础框架,可以帮助开发者深入理解多点触控的原理,并且能够自定义手势操作,为Android应用增加更多交互性。通过阅读和分析源代码,你可以了解到如何处理...

    Android手势识别-多点触控

    在实际应用中,我们通常会创建一个自定义的ImageView类,重写其onTouchEvent()方法,然后在该方法内实现多点触控功能。以下是一个简单的实现: ```java public class TouchImageView extends ImageView { private...

    Android 自定义ImageView(移动、缩放、旋转)

    在`onTouchEvent()`中,我们需要对多个手指的触摸事件进行处理,即实现多点触控(MultiTouch)。这通常涉及到计算两个手指之间的距离和角度,以确定图像应该在哪些轴上移动、缩放或旋转。我们可以使用`...

    多点触控旋转

    以上是实现ImageView多点触控旋转的基本步骤。在实际开发中,可能还需要考虑其他因素,如防止图像扭曲、处理屏幕方向变化等问题。通过这个过程,你可以创建一个功能完善的图片查看器,让用户能够自由地旋转图片。在...

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

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

Global site tag (gtag.js) - Google Analytics