先從movable-view開始說起吧. movable-view是小程序自定義的組件.其描述為:”可移動的視圖容器,在頁面中可以拖拽滑動”. 官方文檔地址:https://mp.weixin.qq.com/debug/wxadoc/dev/component/movable-view.html. 值得注意的是文檔中有一段備注: “當movable-view小于movable-area時,movable-view的移動范圍是在movable-area內;當movable-view大于movable-area時,movable-view的移動范圍必須包含movable-area(x軸方向和y軸方向分開考慮)”. 也就是說父容器movable-area是可以比子容器movable-view小的,但是子容器的移動范圍必須包括父容器. 先看官方實例代碼: 1 <view class="section"> 2 <view class="section__title">movable-view區域小于movable-areaview> 3 <movable-area style="height: 200px;width: 200px;background: red;"> 4 <movable-view style="height: 50px; width: 50px; background: blue;" x="{{x}}" y="{{y}}" direction="all"> 5 movable-view> 6 movable-area> 7 <view class="btn-area"> 8 <button size="mini" bindtap="tap">click me to move to (30px, 30px)button> 9 view> 10 <view class="section__title">movable-view區域大于movable-areaview> 11 <movable-area style="height: 100px;width: 100px;background: red;" direction="all"> 12 <movable-view style="height: 200px; width: 200px; background: blue;"> 13 movable-view> 14 movable-area> 15 view> 這里面有個錯誤,應該是編寫人的一點小失誤吧. 第二個movable-area的屬性direction應該寫在movable-view上. 1 看下效果: 1) 當movable-view區域小于movable-area時,子容器movable-view只能在父容器內移動. 下圖的效果是設置了屬性 out-of-bounds=”true”的效果. out-of-bounds可以染子容器到達父容器邊界時有個超出邊界然后回彈的動畫. 并不是真正能讓子容器移動到父容器以外. 2) 當movable-view區域大于movable-area時,子容器移動的范圍必須包括父容器. 第二種情況中,把父容器看做手機屏幕可視區域,子容器看做要查看的長圖,大圖. 就可以實現拖動查看圖片的效果. 如果圖片時動態加載的,不是固定的圖片,就要兼容圖片寬高小于屏幕可視寬高和圖片寬高大于可視屏幕寬高的可能性,也就是要考慮到以上兩種情況. 我們要在movable組件加載的同時設置好movable-view的寬高,因為movable組件加載成功后再去改變movable-view的大小,可移動區域是不會變的. 我們可以通過頁面中要查看的圖片的onload事件中獲取圖片寬高(目前我只發現bindload事件能獲取到圖片寬高),然后存儲起來imgWidth和imgHeight. 當用戶點擊圖片時,在bindtap事件中設置好movable-view的寬高,同時將movable-area的彈窗wx;if設置為true. 1 2 <view class="flex-wrap flex-pic"> 3 <view class="picList"> 4 因為要查看的是一個圖片列表, 我用了一個數組去存儲每個圖片的寬高,然后通過圖片id來關聯 1 /** 2 * 加載圖片 3 */ 4 imageOnload:function(e){ 5 var id = e.currentTarget.id 6 this.data.imgIdList[id] = { 7 width:e.detail.width, 8 height:e.detail.height 9 } 10 11 }, 模板頁面1 3 <template name="resizePic"> 4 5 <scroll-view class="backdrop"> 6 <view class="close-icon" bindtap="closeResizeModal"> 7 取消預覽 8 view> 9 <movable-area style="width:100%;height:100%;" > 10 <movable-view direction="all" 11 out-of-bounds="true" x="{{img.x}}" y="{{img.y}}" > 12 <image mode="widthFix" class="dtl-img" src="{{img.currentSrc}}">image> 13 movable-view> 14 15 movable-area> 16 scroll-view> 17 template> 1 /** 2 * 打開彈窗 3 */ 4 showResizeModal: function (e) { 5 var src = e.currentTarget.dataset.src; 6 var x = 0 7 var y =0 8 try { 9 var width = this.imgIdList[e.currentTarget.id].width; //圖片原寬 10 var height = this.imgIdList[e.currentTarget.id].height; //圖片原高 11 12 //小程序默認固定寬320px,獲取top和left值,使圖片居中顯示 13 height = height * (320 / width); 14 width = 320; 15 16 x = (app.windowWidth - width) / 2 17 y = (app.windowHeight - height) / 2 18 19 } catch (e) { } 20 var img = { 21 x: x, 22 y: y, 26 currentSrc: src, 27 }; 28 this.setData({ img: img, isCheckDtl: true }); 29 30 }, 部分CSS代碼.backdrop{ background: rgba(0, 0, 0, 1); width:100%; height: 100%; position: fixed; top:0; left:0; } 以上基本上可以完成一個點擊查看圖片的需求. 然而如果再支持雙指縮放的話,movable-view實現不了.我暫沒想出來怎么實現,如果有人知道,希望能夠指點迷津. 主要原因是因為還是我上文提到的那句話:”movable組件加載成功后再去改變movable-view的大小,可移動區域是不會變的”.縮放后圖片大小肯定會改變的. 縮小還好,一旦放大,可移動區域還是原來的不會改變.想象一下,如果一張寬度剛剛好時屏幕可視寬度的圖片,放大后,這張圖片就只能在屏幕可視寬度windowWidth的范圍中移動,看不到左也看不到右邊超出的部分. 所以如果既要可移動圖片又要可縮放,就不能用movable-view組件了,自己寫個吧. 原來bindtouchmove會觸發頁面的滾動條,但是現在微信好像已經修復了這個BUG,我今天在真機上測試沒有出現這個問題. 自定義控件resizePicModal.wxml: 1 2 <template name="resizePic"> 3 <scroll-view class="backdrop" catchtouchmove="bindTouchMove" catchtouchend="bindTouchEnd" bindtouchstart="bindTouchStart" > 4 <view class="close-icon" bindtap="closeResizeModal"> 5 取消預覽 6 view> 7 <image catchtouchmove="bindTouchMove" bindtouchend="bindTouchEnd" bindtouchstart="bindTouchStart" 8 style=" transform: scale({{img.baseScale}}); position:absolute; top:{{img.top}}px; left:{{img.left}}px; " 9 mode="widthFix" class= |