JS实现鼠标中心放大图片功能原理及实例演示

版权声明:本文为博主原创文章,未经博主允许不得转载。

在制作网页的过程中,特别是对于浏览图片的网页,难免会涉及实现图片放大缩小及拖拽的功能,一般上述的功能很好实现,但是很多小伙伴发现其实有一个东西很难搞,那就是如何实现鼠标中心放大图片功能?


首先,我要讲一下这一功能的数学原理:

这里写图片描述

上图是图片放大的效果图,对此,说明一下图中的参数:

图中, 十字代表鼠标光标的位置,
zrX:鼠标到原图左边距,
zrY:鼠标到原图顶边距,
zrX’:鼠标到放大图左边距,
zrY’:鼠标到放大图顶边距,

mL: 原图左边缘到Frame左边距,
mT: 原图上边缘到Frame顶边距,
mL’:放大图左边缘到Frame左边距,
mT’ : 放大图上边缘到Frame顶边距。


好了,首先像一个问题,该功能,我通过何种方法实现?

如果图片以鼠标所在点为中心放大或缩小,图片四边将会各自想外扩张,也就是将会有不同的增量,这样导致放大后的图片在Frame中的位置与之前不同,通过设置放大前与放大后图片的位置即可实现该功能。


那么,通过什么来定位呢?

通过上述的两个参数mT和mL也就是图片上边缘到Frame顶边距以及图片的左边到Frame左边距。这道几何题最后要求的就是放大后的mL’以及mT’。

如何求上述的两个值?

首先我们要搞清楚哪些是已知的,哪些是未知的:

在onmousewheel事件的情况下,获取event对象,
zrX:鼠标到原图左边距,event.zrX
zrY:鼠标到原图顶边距,event.zrY

获取图片所在的dom对象img
mL: 原图左边缘到Frame左边距,img.offsetLeft
mT: 原图上边缘到Frame顶边距,img.offsetTop

原图尺寸:img.width和img.height
放大系数:λ(手动输入)
放大图尺寸:img.width’和img.height’

img.width’ = λ · img.width
img.height’ = λ · img.height

以下是未知参数:

zrX’:鼠标到放大图左边距,
zrY’:鼠标到放大图顶边距,
mL’:放大图左边缘到Frame左边距,
mT’ : 放大图上边缘到Frame顶边距。

如何求上述未知参数?

首先通过对比关系得出zrX与zrX’及zrY与zrY’的关系式:

这里写图片描述

其次,通过鼠标对于Frame的相对位置不变的关系建立mL,mL’, mT, mT’的等式:

这里写图片描述

最后通过上述等式得出mL’与mT’的表达式:

这里写图片描述
这样就能求出图片放大的后的位置,至于缩小情况,不再赘述,只要把放大图作为原图,之前的原图作为缩小图即可,上述等式依然可用。

接下来是实例演示:

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,下面是实现图片放大缩小功能ZoomControls控件的用法实例: 1. 在 XML 布局文件中添加 ZoomControls 控件: ```xml <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="matrix" android:src="@drawable/image" /> <ZoomControls android:id="@+id/zoomControls" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" /> </FrameLayout> ``` 2. 在 Activity 中获取 ImageView 和 ZoomControls 对象,并设置监听器: ```java public class MainActivity extends AppCompatActivity { private ImageView imageView; private ZoomControls zoomControls; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); zoomControls = findViewById(R.id.zoomControls); zoomControls.setOnZoomInClickListener(new View.OnClickListener() { @Override public void onClick(View v) { float scale = imageView.getScaleX() + 0.5f; imageView.setScaleX(scale); imageView.setScaleY(scale); } }); zoomControls.setOnZoomOutClickListener(new View.OnClickListener() { @Override public void onClick(View v) { float scale = imageView.getScaleX() - 0.5f; if (scale < 1) { scale = 1; } imageView.setScaleX(scale); imageView.setScaleY(scale); } }); } } ``` 3. 在监听器中实现图片的缩放功能,通过 ImageView 的 setScaleX() 和 setScaleY() 方法实现缩放。 以上就是实现图片放大缩小功能ZoomControls控件的用法实例,希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值