[Android View] 判断是否点中一个动态可旋转、可缩放、可移动的图片

本文介绍了一种在Android平台上实现触摸识别的方法,能够准确判断手指触摸的位置是否在经过旋转和缩放后的图片上。通过使用Matrix进行坐标转换,使得即使图片发生旋转或缩放,也能正确地判断出触摸点是否在图片区域内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/Dylan465/article/details/8351007

 

先看图,效果就是这样了,点中图片会变蓝色



项目下载地址:

http://download.youkuaiyun.com/download/dylan465/4911020

  1.   

如果一个图片只是简单的移动,这个很容易就可以判断出触控点是否落在绘制bitmap的矩形区域,但这个bitmap能动态旋转、缩放那就不能用老一套的方法了。

图片左上角的点在图片旋转之后A的坐标落在哪里?图片缩放后A又在哪里?坐标的转换涉及到比较复杂的计算公式,好在有Matrix!矩阵是个好东西!哈哈!请看代码

监听onTouch并转换坐标

  1. @Override  
  2. public boolean onTouchEvent(MotionEvent event) {  
  3.     // TODO Auto-generated method stub  
  4.     if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  5.   
  6.         // 获取触控点  
  7.         float tx = event.getX();  
  8.         float ty = event.getY();  
  9.         // 存放新坐标的数组  
  10.         float[] dst = new float[2];  
  11.         // 触控点坐标的数组  
  12.         float[] src = { tx, ty };  
  13.         Matrix matrix = new Matrix();  
  14.         // 获取绘制图片的Matrix,并转换mantrix  
  15.         // set inverse to be the inverse of this matrix.  
  16.         if (object.getMatrix().invert(matrix)) {  
  17.             // 触控坐标根据matrix转换成新的坐标,并存放于dst  
  18.             matrix.mapPoints(dst, src);  
  19.         }  
  20.         // 判断是否击中  
  21.         if (object.isHitObject(dst[0], dst[1])) {  
  22.             object.setBitmap(hitBitmap);  
  23.         } else {  
  24.             object.setBitmap(missBitmap);  
  25.         }  
  26.     } else if (event.getAction() == MotionEvent.ACTION_UP) {  
  27.         object.setBitmap(missBitmap);  
  28.     }  
  29.     return true;  
  30. }  
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if (event.getAction() == MotionEvent.ACTION_DOWN) {

			// 获取触控点
			float tx = event.getX();
			float ty = event.getY();
			// 存放新坐标的数组
			float[] dst = new float[2];
			// 触控点坐标的数组
			float[] src = { tx, ty };
			Matrix matrix = new Matrix();
			// 获取绘制图片的Matrix,并转换mantrix
			// set inverse to be the inverse of this matrix.
			if (object.getMatrix().invert(matrix)) {
				// 触控坐标根据matrix转换成新的坐标,并存放于dst
				matrix.mapPoints(dst, src);
			}
			// 判断是否击中
			if (object.isHitObject(dst[0], dst[1])) {
				object.setBitmap(hitBitmap);
			} else {
				object.setBitmap(missBitmap);
			}
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			object.setBitmap(missBitmap);
		}
		return true;
	}

 判断是否击中bitmap

  1. /** 
  2.  * 判断是否击中bitmap 
  3.  */  
  4. public boolean isHitObject(float hitX, float hitY) {  
  5.     if (hitX >= 0 && hitX <= getBitmap().getWidth() && hitY >= 0  
  6.             && hitY <= getBitmap().getHeight()) {  
  7.         return true;  
  8.     }  
  9.     return false;  
  10. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值