(在真机上的效果就不演示了,是差不多的)

实现思路

布局

在这里运用到了微信小程序的moveable-area和moveable-view两个标签。

moveable-area是可拖拽的区域,需要设置其宽高。由于图片的大小我是根据屏幕来动态设置的,所以moveable-area的宽度是固定的100%,高度由上传的图片总高度决定,所以一开始的时候,我设置了最小高度。

moveable-view的宽高跟图片一致,也是动态设置,初始状态是隐藏的,当图片被长按时才会显示。当长按要排序的图片的时候,记录它的url,并赋值给moveable-view的image。

X

+

复制代码

页面初始化时计算宽高的js

// 计算图片宽度

_handleComputedImage:function(e){

const windowWidth = app.globalData.systemInfo.windowWidth;

const width = windowWidth - 16;

const imageWitdh = (width - 16) / 3;

this.setData({

imageWitdh

})

},复制代码

在上传图片之后,我们需要改变moveable-area的高度

// 选择图片

handleChooseImage: function (e) {

let length = this.data.images.length;

if (length == 9) {

wx.showToast({

title: "亲,最多只能选择九张图哦~",icon: "none",duration: 2000

})

return false;

}

var that = this;

wx.chooseImage({

count: 9 - this.data.images.length,sizeType: ['compressed'],//可选择原图或压缩后的图片

sourceType: ['album','camera'],//可选择性开放访问相册、相机

success: res => {

let images = that.data.images;

for (let i = 0; i < res.tempFilePaths.length;i++){

images.push(res.tempFilePaths[i]);

}

that.setData({

images

},function(){

//上传完之后更新面积

that._handleComputedArea();

});

},fail: err => console.log(err)

})

},复制代码

更新面积的计算如下,它的高度由.image-choose-container的view决定:

// 计算movable-area的高度

_handleComputedArea:function(e){

let that = this;

wx.createSelectorQuery().selectAll('.image-choose-container').boundingClientRect(function (rect) {

that.setData({

areaHeight: rect[0].height

})

}).exec()

},复制代码

p.s. 当删除图片的时候,我们也需要重新计算moveable-area的高度。

长按图片

图片可以拖拽排序的触发机制是长按。

在长按的时候,我们需要计算每张图片的坐标(这里的坐标不是固定的,当你的页面可以拖动的时候,坐标值是会发生改变)并保存;

记录当前图片在图片数组中的下标、url;

显示moveable-view,并设置其x、y值,将url赋值给其下的子元素。

// 计算每张图片的坐标

_handleComputedPoints(e){

let that = this;

var query = wx.createSelectorQuery();

var nodesRef = query.selectAll(".image-item");

nodesRef.fields({

dataset: true,rect: true

},(result) => {

that.setData({

pointsArr: result

})

}).exec()

},复制代码

// 长按图片

handleLongTap:function(e){

// 计算每张图片的坐标

this._handleComputedPoints();

this.setData({

currentImg: e.currentTarget.dataset.url,currentIndex: e.currentTarget.dataset.index,hidden: false,flag: true,x: e.currentTarget.offsetLeft,y: e.currentTarget.offsetTop

})

},复制代码

此时,长按图片,moveable-view(带有边框)将会出现在该图片之上。

移动图片

监听moveable-view的catchtouchmove事件,(不使用bindhtouchmove的原因是因为在图片移动的过程中,如果页面是可滑动的,会导致页面页跟着滑动),记录当前手指在页面上的位置e.touches[0].pageX和e.touches[0].pageY。

为了保证手指在移动的过程中,图片能跟着手指一起移动,则moveable-view的x距离是手指的e.touches[0].pageX,而y距离则是e.touches[0].pageX - 滚动条的移动距离-image-choose-container这个元素距离顶部的距离。

为了保证在移动图片的过程中,图片始终能在手指的中间,还将x,y分别减去图片的宽度。(对比两图,鼠标与moveable-view的位置)

// 移动的过程中

handleTouchMove:function(e){

let x = e.touches[0].pageX;

let y = e.touches[0].pageY;

// 首先先获得当前image-choose-container距离顶部的距离

let that = this;

wx.createSelectorQuery().selectAll('.image-choose-container').boundingClientRect(function (rect) {

let top = rect[0].top;

y = y - that.data.scrollTop - top;

that.setData({

x: x - that.data.imageWitdh / 2 > 0 ? x - that.data.imageWitdh / 2:0,y: y - that.data.imageWitdh / 2 > 0 ? y - that.data.imageWitdh / 2:0,})

}).exec()

},复制代码

// 监听滚动

onPageScroll:function(e){

this.data.scrollTop = e.scrollTop;

}

复制代码

停止拖拽时

监听moveable-view的bindtouchend事件,计算出当前的x,y值,对比每个图片的下标,得出它移动到哪个位置,更新数组,完毕。

// 移动结束的时候

handleTouchEnd:function(e){

if (!this.data.flag) {

// 非长按情况下

return;

}

let x = e.changedTouches[0].pageX;

let y = e.changedTouches[0].pageY - this.data.scrollTop;

// 每张图片的地址

const pointsArr = this.data.pointsArr;

let data = this.data.images;

for (var j = 0; j < pointsArr.length; j++) {

const item = pointsArr[j];

if (x > item.left && x < item.right && y > item.top && y < item.bottom) {

const endIndex = item.dataset.index;

const beginIndex = this.data.currentIndex;

//临时保存移动的目标数据

let temp = data[beginIndex];

//将移动目标的下标值替换为被移动目标的下标值

data[beginIndex] = data[endIndex];

//将被移动目标的下标值替换为beginIndex

data[endIndex] = temp;

}

}

this.setData({

images: data,hidden: true,flag: false,currentImg: ''

})

},复制代码

总结

以上是编程之家为你收集整理的微信小程序实现九宫格图片拖拽全部内容,希望文章能够帮你解决微信小程序实现九宫格图片拖拽所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

android可拖拽九宫格,微信小程序实现九宫格图片拖拽相关推荐

  1. 微信小程序怎么实现 图片按住一角缩放、旋转、拖拽

    微信小程序怎么实现 图片按住一角缩放.旋转.拖拽 图片一角可以加个小图片,按住来操作 利用movable-view.movable-area 可以实现拖拽缩放.不好旋转 是不是可以利用canvas绘图 ...

  2. 小程序提交表单mysql_GitHub - kun19911227/minipro: 微信小程序提交带图片的表单

    minipro 微信小程序提交带图片的表单 目录说明 upload_images ├── pages │ ├── upload_info 提交表单 │ └── display_info 信息展示 ├─ ...

  3. 为什么微信小程序里的图片在电脑上显示在手机上不显示?

    <image class='carousel' src="/images/图片301@2x.png"></image> 电脑上显示图片,但手机上是空白的 & ...

  4. 关于微信小程序不能显示图片

    本人场景:wxml <image> 标签设置 src="../../images/中文名.png" 时出现 IOS 端显示没问题,而安卓端不显示图片的问题. 上网一查才 ...

  5. 微信小程序:修复图片音频全新升级带特效喝酒神器源码

    这是一款全新升级带特效喝酒神器小游戏微信小程序源码 小编发现很多喝酒神器小程序都不带特效和音效的 感觉差了那么一点意思而且感觉也不炫酷 所以小编今天给大家带来一款带特效,音效炫酷的喝酒神器 该款神器由 ...

  6. 微信图片 自动上传到服务器,微信小程序怎样使图片上传至服务器

    这次给大家带来微信小程序怎样使图片上传至服务器,微信小程序使图片上传至服务器的注意事项有哪些,下面就是实战案例,一起来看一下.-wxml 发布项目 /**选择图片 */ choose: functio ...

  7. Uni-app开发微信小程序使用本地图片做背景图

    Uni-app开发微信小程序使用本地图片做背景图 <view class="content" :style="{backgroundImage:'url(' + i ...

  8. 微信小程序中的图片处理

    微信小程序中的图片处理 微信小程序中的<image></image>用于向页面中插入图片.有两个重要的属性 1.src  要插入图片的资源地址 2.mode   图片裁剪.缩放 ...

  9. 微信小程序长按图片发送给好友

    问题描述 微信小程序长按图片发送给好友 解决方法 直接在<image></image>标签添加:show-menu-by-longpress="true" ...

最新文章

  1. 2014 年美国程序员薪资调查
  2. Javascript 是如何体现继承的 ?
  3. 女生学计算机有什么要求,女生学计算机专业好吗?
  4. jsp内置对象+Servlet
  5. 机器学习第二篇:详解KNN算法
  6. php 错误提示开启,php开启与关闭错误提示,php开启错误提示_PHP教程
  7. 循环次数几次_圆柱模板循环使用次数是多少呢
  8. mysql数据库管理维护_(转)Mysql数据库管理 表的维护
  9. mysql中php生成唯一ID
  10. [解答]对‘’未定义的引用 collect2: 错误: ld 返回 1
  11. 北卡罗来纳大学遗传算法工具箱
  12. 论文查重不能超过多少?
  13. python微信投票平台_Python——开发一个自动化微信投票器【附代码实例方法】
  14. C++17之std::any
  15. 老贴纪念六(纪念热得快君)
  16. 2. Java模板引擎 —— JavaPoet的简单使用
  17. Psins代码解析之全局变量轨迹仿真(test_SINS_trj.m)惯性解算(test_SINS.m)
  18. 对Rapidly-exploring Random Trees(RRT)路径规划方法的理解
  19. 全国计算机等级考试二级C语言程序设计五合一 新版上机题库pdf
  20. 1.0 Lua教程之基本语法

热门文章

  1. 计算机科学终审多长时间,一些计算机科学核心期刊的投稿经验
  2. 互联网晚报 | 10月10日 星期日 | 湖南卫视回应《快本》停播传言;淘特上线微信扫码付;SpaceX成全球第二大创业公司...
  3. 【HTML】iframe标签
  4. 对y_pred强制二分类
  5. java实现抛物线轨迹计算_JavaFX中抛物线轨迹的时间线
  6. matlab标定不是棋盘格,matlab 标定提取棋盘格角点调整参数
  7. CC00157.CloudKubernetes——|KuberNetes服务发布.V08|——|service.v04|验证service|
  8. 笔记本电脑桌面上计算机打不开怎么办,笔记本电脑开了机一直进不去桌面怎么办...
  9. 5G NR PDCP协议(一)
  10. matlab多元回归模型分析,matlab多元回归工具箱 Excel数据分析工具进行多元回归分析.doc...