`
yq135314
  • 浏览: 255100 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

图片热区点击之二(边界反弹,缩放,移动)

阅读更多

背景:对图片的部分区域进行点击,响应相应的事件(可对图片进行放大,边界反弹,以及图片移动)

针对于前次的热区点击做了个补充

 1.对图片的部分区域进行可响应事件

 2.对图片进行缩放后,仍可响应区域点击事件

 3.对图片进行移动后.仍可响应区域点击事件

 4.当图片移出边界区域后,可进行回弹.

其效果图如下(GIF图片较大,只截取一部分,在模拟器上,缩放效果无法演示)

 部分关键性代码:

 a.对点击的区域进行判断,

		/**
		 * 检测是否在区域范围内
		 * @param rectf 从外部传可以重用
		 * @param x
		 * @param y
		 * @return
		 */
		public boolean isInArea(RectF rectf, float x, float y) {
			boolean resStatus = false;
			if(this.path != null) {
				rectf.setEmpty();
				path.computeBounds(rectf, true);
				if(isRectF) {
					//当是矩形时
					resStatus = rectf.contains(x, y);
				}else {
					//如果是多边形时
					Region region = new Region();
					region.setPath(path, region);
					region.setPath(path, new Region((int)rectf.left, (int)rectf.top, (int)rectf.right, (int)rectf.bottom));
					resStatus = region.contains((int)x, (int)y);
				}
			}
			return resStatus;
		}

 b. 滑动或缩放完成后,是否移出边界检测

	/**
	 * 边界反弹事件检测
	 * @param event
	 */
	protected void upToCheckOutOfSide(MotionEvent event) {
		float scale = getCurrentScale();
		float[] moveXY = getCurrentMoveXY();
		float curBitWidth = scale * BIT_WIDTH;
		float curBitHeight = scale * BIT_HEIGHT;
		float[] dstXY = new float[2];
		boolean needMove = false;
		dstXY[0] = moveXY[0];
		dstXY[1] = moveXY[1];
		//当图片的高度小于视图高度时
		if(curBitHeight <= VIEW_HEIGHT) {
			needMove = true;
			dstXY[1] = (VIEW_HEIGHT - curBitHeight) / 2.0f;
		}
		
		//当图片的宽度小于视图宽度时
		if(curBitWidth <= VIEW_WIDTH) {
			needMove = true;
			dstXY[0] = (VIEW_WIDTH - curBitWidth) / 2.0f;
		}
		
		//当图片高度大于视图的高度时
		if(curBitHeight > VIEW_HEIGHT) {
			float distance = event.getY() - mPointF.y;
			//手向下滑动
			if(distance > 0) {
				if(moveXY[1] > 0) {
					dstXY[1] = 0;
					needMove = true;
				}
				//手向上滑动
			}else if(distance < 0) {
				float goalY = VIEW_HEIGHT - curBitHeight;
				if(moveXY[1] < goalY) {
					dstXY[1] = goalY;
					needMove = true;
				}
			}
		}
		//图片的当前宽度大小视图的高度时
		if(curBitWidth > VIEW_WIDTH) {
			float distance = event.getX() - mPointF.x;
			//向右滑动
			if(distance > 0) {
				if(moveXY[0] > 0) {
					dstXY[0] = 0;
					needMove = true;
				}
				//向左滑动
			}else if(distance < 0) {
				float goalX = VIEW_WIDTH - curBitWidth;
				if(moveXY[0] < goalX) {
					dstXY[0] = goalX;
					needMove = true;
				}
			}
		}
		
		if(needMove) {
			mViewHandler.postDelayed(new MoveRunnable(moveXY[0], moveXY[1], dstXY[0], dstXY[1]), 0);
		}
	}

 c.边界移动的Runnable

	/**
	 * 反弹时的动画线程
	 */
	protected class MoveRunnable implements Runnable {
		
		//移动的步长
		private final static int MOVE_STEEP = 20;
		//移动的方向
		private float direct;
		//是X方向上的移动还是Y方向上的移动
		private boolean isMoveX;
		
		private float srcX, srcY, dstX, dstY;
		
		//一元一次方程
		private float a, b;
		
		public MoveRunnable(float srcX,  float srcY, float dstX, float dstY) {
			this.srcX = srcX;
			this.srcY = srcY;
			this.dstX = dstX;
			this.dstY = dstY;
			//求解A,B
			if((dstY - srcY) != 0 && (dstX - srcX) != 0) {
				a = (dstY - srcY) / (dstX - srcX);
				b = dstY - a * dstX;
			}
			//以长的作为出发点
			isMoveX = Math.abs(srcX - dstX) > Math.abs(srcY - dstY);
			direct = isMoveX ? ((dstX - srcX) > 0 ? 1.0f : -1.0f) : ((dstY - srcY) > 0 ? 1.0f : -1.0f);
			isAnimation = true;
		}
		@Override
		public void run() {
			float distanceX = 0;
			float distanceY = 0;
			boolean isEnd = false;
			if(isMoveX) {
				distanceX = direct * MOVE_STEEP;
				srcX += distanceX;
				if(direct > 0) {
					if(srcX >= dstX) {
						isEnd = true;
						srcX -= distanceX;
						distanceX = dstX - srcX;
						srcX = dstX;
					}
				}else {
					if(srcX <= dstX) {
						isEnd = true;
						srcX -= distanceX;
						distanceX = dstX - srcX;
						srcX = dstX;
					}
				}
				
				if(a == 0 && b == 0) {
					distanceY = 0;
				}else {
					float tempY = a * srcX + b;
					distanceY = tempY - srcY;
					srcY = tempY;
				}
			}else {
				distanceY = direct * MOVE_STEEP;
				srcY += distanceY;
				if(direct > 0 ) {
					if(srcY >= dstY) {
						isEnd = true;
						srcY -= distanceY;
						distanceY = dstY - srcY;
						srcY = dstY;
					}
				}else {
					if(srcY <= dstY) {
						isEnd = true;
						srcY -= distanceY;
						distanceY = dstY - srcY;
						srcY = dstY;
					}
				}
				
				if(a == 0 && b == 0 ) {
					distanceX = 0;
				}else {
					float tempX = (srcY - b) / a;
					distanceX = tempX - srcX;
					srcX = tempX;
				}
			}
			mViewHandler.obtainMessage(0, new Float[]{distanceX, distanceY}).sendToTarget();
			if(!isEnd) {
				mViewHandler.postDelayed(this, 10);
			}else {
				isAnimation = false;
				LogUtils.d(TAG, isAnimation + ", End!");
			}
		}
	}

  其它的一些代码在程序中均已经做过注释

 

分享到:
评论
6 楼 lx_yoyo 2015-08-11  
楼主如何在热点区域设置背景颜色
5 楼 89997915 2015-01-26  
楼主,我想在你这个基础上,增加点击区域的效果,麻烦楼主提示下
4 楼 89997915 2015-01-08  
楼主,膜拜了~
3 楼 lwhhuahua 2014-10-09  
太强大了太强大了
2 楼 xgxmlin 2014-08-11  
效果很好,学习学习
1 楼 wangxiaotaolhc 2014-01-23  
楼主太强大了,膜拜!!!

相关推荐

    图片热区功能-图片缩放预览

    【vue3 + ts】支持图片缩放预览和图片热区点击功能

    图片上设置热区,点击图片上的点,执行javascript方法

    在网页设计中,热区(Hotspots)是一种特殊的技术,允许我们为图片的不同区域赋予交互性,使得用户点击这些特定区域时可以触发某些预设的行为,例如执行JavaScript方法。这通常用于实现图像映射,即在一张大图上定义...

    图片热区js插件

    在IT领域,图片热区(Image Maps)是一种常见的网页交互技术,它允许用户在图片上定义特定区域,每个区域可以关联不同的链接或者触发不同的事件。"图片热区js插件"是一个JavaScript插件,用于在网页中实现这种功能,...

    模拟图片热区 平面图点击及效果

    在IT行业中,模拟图片热区是一项常见的交互设计技术,它允许用户通过点击或悬停在图像的特定区域来触发特定的交互或展示相关信息。在这个场景中,"模拟图片热区 平面图点击及效果"涉及到的技术主要包括PNG定位、图片...

    js 动态设置图片的热区并获取图片坐标

    当用户在图片上移动鼠标或点击时,我们可以获取到鼠标的屏幕坐标。然后,我们需要转换这些坐标为图片上的像素坐标。这通常需要计算图片的缩放比例和偏移量。以下是一个简单的事件处理函数示例: ```javascript ...

    CSS自定义图片热区示例

    在网页设计中,图片热区(Image Map)是一种常见的交互元素,它允许用户与图片的特定区域进行交互,比如点击跳转到不同的链接或者执行其他操作。本示例主要探讨如何使用CSS来自定义图片热区,使得这些交互区域不仅...

    jquery设置图片热区并生成图片

    在IT行业中,尤其是在网页开发领域,图片热区(Image Maps)是一种常见的交互设计技术,它允许我们将图片的不同区域定义为可点击的链接或执行其他交互功能。jQuery,一个流行的JavaScript库,提供了方便的方法来处理...

    Jquery实现html内的图片热区

    在网页设计中,图片热区(Image Map)是一种常见的交互元素,它允许用户通过点击或交互特定区域来触发不同的响应。jQuery 是一个流行的JavaScript库,它简化了DOM操作,事件处理,动画效果等功能,因此使用jQuery...

    为图片根据坐标自动创建热区并点击变颜色

    在网页设计中,"为图片根据坐标自动创建热区并点击变颜色" 是一种交互式功能,它允许用户通过点击图像上的特定位置来定义热区,并可以改变这些区域的颜色或透明度。这种技术通常用于创建图像映射,即在一张图片上...

    c#+jquery+sql 图片动态设置多个热区

    由于项目需要,开发一个c#的图片多热区设置的程序, IDE 使用的VS2010 使用的技术有 c#,jquery数据库使用SQL,数据操作使用LinQ To SQL. ...支持图片缩放,热区自动根据图片缩放进行缩放. 第一次上传自主产品,请支持!

    jQuery图片自定义热区

    **jQuery图片自定义热区**是一种网页开发技术,主要用于增强用户体验,通过在图像上创建可交互的区域,用户可以通过点击或悬停在这些热区上获取额外信息或执行特定操作。这种技术通常用于地图、产品展示或其他需要...

    js 动态获取图片矩形热区,并在热区上添加蒙版,鼠标经过,以半透明形式显示该区域

    - 使用`getBoundingClientRect()`方法获取元素的边界信息,用于计算鼠标位置和热区的关系。 4. **Canvas 绘制蒙版**: - HTML5的`&lt;canvas&gt;`元素可以用于绘制图形,包括矩形和半透明效果。 - 鼠标经过热区时,...

    Axure7.0教程部件详解图片热区 hot spot

    例如,在自定义按钮的设计中,可以使用图片热区来创建点击区域,而不需要在每个按钮上添加事件。 在 AxureRP7.0 中,添加图片热区非常简单,只需要在图片上添加一个热区部件,然后添加事件即可。在设计区域中,图片...

    html页面绘制热区工具

    每个`&lt;area&gt;`标签可以设置`shape`属性(定义形状,如rect、circle、polygon),`coords`属性(定义形状的坐标),以及`href`属性(定义点击热区后跳转的URL)等。例如: - 矩形热区: ```html , y1, x2, y2" href...

    fckeditor热区插件

    图片热区是指在图像上定义特定的可点击区域,这些区域可以链接到其他页面或执行特定的JavaScript动作,为用户提供交互性。 在网页设计中,热区技术常用于创建交互式地图、产品展示或导航菜单。通过热区,我们可以将...

    Android代码-图片不规则区域点击事件处理

    2.对图片进行缩放后,仍可响应区域点击事件 3.对图片进行移动后.仍可响应区域点击事件 4.当图片移出边界区域后,可进行回弹. 如何使用 1、 xml配置 2、 禁止缩放 mHotView.setCanScale(false); 3、 禁止滑动 ...

    C#图像热区识别(思路)

    5. **扩展区域**:为了确保用户点击时不会因为微小的偏移而错过热区,可以考虑对识别到的热区进行适当扩展,比如使用膨胀算法增加边界。 6. **事件处理**:当用户在图像上点击时,获取鼠标位置,然后检查这个位置...

    热区随网页大小等比放缩

    6. **CSS3的缩放属性(CSS3 Scale Transform)**:使用CSS3的transform属性中的scale函数,可以轻松地对热区进行等比缩放。例如,`transform: scale(x,y)` 其中 x 和 y 分别是水平和垂直方向的缩放比例,确保热区在...

    用Delphi实现热点(图片部分设为热区)

    3. **处理事件**:当用户在热区内点击或移动鼠标时,相应的事件处理器会被调用。你可以在此处编写代码,以便在用户与热区交互时执行特定操作。例如,可以弹出一个消息框,打开一个新的窗体,或者通过网络发送数据。 ...

Global site tag (gtag.js) - Google Analytics