uni 图片缩放后 ,设置图片可拖动位置

本文介绍了一个关于图片放大的滑动边界控制问题,当图片放大后,原本的<movable-area>默认尺寸导致图片可以被上拉至屏幕外。通过调整<movable-area>的宽高,可以限制图片放大的滑动范围,使其只能滑动到指定位置,从而避免图片滑动超出屏幕。

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

在工作中遇到一个问题,图片放大后,可以一直往上移动,直到图片差点都移动到屏幕外,而实际想要的效果,是图片放大后,只能上拉到指定位置。

处理方法:设置<movable-area>的宽高。默认宽高只有10px,我一开始没注意到这个问题,默认的10px刚好就在顶部,所以图片放大后可以被上拉到差点都在屏幕外。

### 实现 UniApp拖动图片四角完成缩放效果 为了实现在 UniApp 中通过拖动四个角落来调整图片大小的效果,可以利用 uni-app 提供的 Canvas API 和触摸事件处理机制。具体来说,可以通过监听触控事件并动态更新 canvas 上绘制的内容来达到这一目的。 #### 使用 Canvas 进行绘图操作 在 UniApp 的环境中,`<canvas>` 组件用于创建画布,在其上执行各种图形渲染任务。对于本案例而言,主要涉及的是基于用户的交互行为实时修改图像的位置与尺寸[^1]。 ```html <!-- wxml --> <view class="container"> <canvas type="2d" id="myCanvas"></canvas> </view> ``` ```css /* wxss */ .container { position: relative; } #myCanvas { width: 300px; height: 300px; border: 1px solid black; } ``` ```javascript // js export default { data() { return { ctx: null, imgSrc: '/static/test.png', // 图片路径 startX: 0, startY: 0, scale: 1, moveX: 0, moveY: 0, isDraggingCorner: false, cornerSize: 20 } }, onLoad() { const query = this.createSelectorQuery(); query.select('#myCanvas') .fields({node:true, size:true}) .exec((res)=>{ let canvas = res[0].node; let ctx = canvas.getContext('2d'); this.ctx = ctx; // 加载初始图片 wx.getImageInfo({ src: this.imgSrc, success:(imageInfo) => { this.drawImage(imageInfo); } }); }) // 添加手势识别逻辑... function drawImage(info){ let {width,height} = info; // 计算新的宽高以适应容器 let newWidth = Math.min(width * this.scale, window.innerWidth - (this.cornerSize*2)); let newHeight = (newWidth / width)*height; this.ctx.clearRect(0, 0, canvas.width, canvas.height); // 将图片居中显示 this.ctx.drawImage( info.path, this.moveX + ((window.innerWidth-newWidth)/2), this.moveY + ((window.innerHeight-newHeight)/2), newWidth, newHeight ); // 绘制控制点 ['nw','ne','sw','se'].forEach(pos=>{ let [x,y]=[0,0]; switch(pos){ case 'nw': x=this.moveX;y=this.moveY;break; case 'ne': x=window.innerWidth-this.cornerSize-this.moveX;y=this.moveY;break; case 'sw': x=this.moveX;y=window.innerHeight-this.cornerSize-this.moveY;break; case 'se': x=window.innerWidth-this.cornerSize-this.moveX;y=window.innerHeight-this.cornerSize-this.moveY;break; } this.ctx.fillStyle='red'; this.ctx.fillRect(x,y,this.cornerSize,this.cornerSize); }); } }, methods:{ handleTouchStart(e){ if(!e.touches.length){return;} let touch=e.touches[0]; // 判断点击位置是否位于某个角内 [...document.querySelectorAll('.corner')].some(el=>{if(isPointInRect(touch.clientX,touch.clientY,el)){this.isDraggingCorner=true;}}); }, handleTouchMove(e){ if(this.isDraggingCorner && e.touches.length>0){ let touch=e.touches[0]; // 更新移动距离和缩放比例 this.moveX +=touch.clientX-this.startX; this.moveY +=touch.clientY-this.startY; this.scale+=Math.sqrt(Math.pow(touch.clientX-this.startX,2)+Math.pow(touch.clientY-this.startY,2))/100; this.startX=touch.clientX; this.startY=touch.clientY; // 重新绘制 wx.getImageInfo({ src:this.imgSrc, success:imageInfo=>this.drawImage(imageInfo) }); } }, handleTouchEnd(){ this.isDraggingCorner=false; } } }; ``` 上述代码展示了如何在一个简单的场景下实现基本功能:加载一张图片至 `<canvas>` 并允许用户通过拖拽四个红色方块改变图片大小。需要注意的是这只是一个基础框架,实际应用可能还需要考虑更多细节优化用户体验以及兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值