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

转自:http://blog.csdn.net/Dylan465/article/details/8351007

 

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



项目下载地址:

http://download.csdn.net/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. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值