背景:对图片的部分区域进行点击,响应相应的事件(可对图片进行放大,边界反弹,以及图片移动)
针对于前次的热区点击做了个补充
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!"); } } }
其它的一些代码在程序中均已经做过注释
相关推荐
热区应用的例子 在图片上设置热区,点击图片上的点,执行javascript方法
【vue3 + ts】支持图片缩放预览和图片热区点击功能
图片热区,自由编辑页面模型和自定义链接,只要用idea直接就可以用浏览器打开,注释应有尽有
模拟图片热区功能,利用.png定位在大图上,鼠标经过平面图有凸效果,可点击;可随网页大小缩放,
jquery设置图片热区并生成图片
由于项目需要,开发一个c#的图片多热区设置的程序, IDE 使用的VS2010 使用的技术有 c#,jquery数据库使用SQL,数据操作使用LinQ To SQL. ...支持图片缩放,热区自动根据图片缩放进行缩放. 第一次上传自主产品,请支持!
CSS自定义图片热区示例代码,直接在HTML里,查看代码
可以在页面上用鼠标随便点击 获取两个坐标、并自动创建热区、点击可以为此选取添加颜色、调至透明度
js 动态设置图片的热区并获取图片坐标 浏览器 均兼容 你懂的
1、可添加多个热区, 2、可拖动热区位置及大小, 3、可为每个热区添加连接
可以自定义在图片上增加热区,可标记多个,结合cookie插件保存
可以在html绘制矩形、圆形、图片等形状,形成热区坐标。
使fckeditor具备图片热区的功能,本部分是测试demo,还未包含插件,随后上传
用Delphi实现热点(图片部分设为热区)
js 动态获取图片上的矩形热区,可随意选择区域。鼠标经过该区域时,会出现一半透明蒙版,显示该区域的位置大小。点击可超链接。创建的热区可修改链接,也可以动态删除热区
Axure7.0教程部件详解图片热区 hot spot
用frontpage为图片插入热区,应该注意的事项,为什么在淘宝后台中不能用热区。
vue实现在图片中画矩形框(JS图片画方块定位坐标),并得到对角坐标,并拿到对应坐标制作图片热区并设置map中area的样式(图片热区map area的用法)
Fckeditor2.6.4最终版增强版.rar 图片热区 上传文件, 远程图片,直接可以使用