小程序的拖拽、缩放和旋转手势

在开发中,有时会遇到像App中的手势那样的效果,下面就仿照App实现了一下。

wxml部分:

<view class="touch-container">
 <view class="msg">{{msg}}</view>
 <image
 class="img"
 src="{{src}}"
 style="width: {{width}}rpx; height: {{height}}rpx; left: {{left}}rpx; top: {{top}}rpx; transform: translate(-50%, -50%) scale({{ scale }}) rotate({{ rotate }}deg);"
 bindload="bindload"
 catchtouchstart="touchstart"
 catchtouchmove="touchmove"
 catchtouchend="touchend"
 ></image>
</view>

wxss部分:

page {

  width: 100%;

  height: 100%;

  background: #ffffff;

}

.touch-container {

  width: 100%;

  height: 100%;

  padding-top: 0.1px;

}

.msg {

  width: 100%;

  height: 60rpx;

  line-height: 60rpx;

  text-align: center;

  font-size: 30rpx;

  color: #666666;

}

.img {

  position: absolute;

  width: 690rpx;

  height: 300rpx;

  transform-origin: center center;

}

js部分:

var canOnePointMove = false

var onePoint = {

  x: 0,

  y: 0

}

var twoPoint = {

  x1: 0,

  y1: 0,

  x2: 0,

  y2: 0

}

Page({

  data: {

    msg: '',

    src: 'http://img01.taopic.com/150508/318763-15050PU9398.jpg',

    width: 0,

    height: 0,

    left: 375,

    top: 600,

    scale: 1,

    rotate: 0

 },

 // 关闭上拉加载

  onReachBottom: function() {

 return

 },

  bindload: function(e) {

 var that = this

 var width = e.detail.width

 var height = e.detail.height

 if (width > 750) {

      height = 750 * height / width

      width = 750

 }

 if (height > 1200) {

      width = 1200 * width / height

      height = 1200

 }

    that.setData({

      width: width,

      height: height

 })

 },

  touchstart: function(e) {

 var that = this

 if (e.touches.length < 2) {

      canOnePointMove = true

      onePoint.x = e.touches[0].pageX * 2

      onePoint.y = e.touches[0].pageY * 2

 }else {

      twoPoint.x1 = e.touches[0].pageX * 2

      twoPoint.y1 = e.touches[0].pageY * 2

      twoPoint.x2 = e.touches[1].pageX * 2

      twoPoint.y2 = e.touches[1].pageY * 2

 }

 },

  touchmove: function(e){

 var that = this

 if (e.touches.length < 2 && canOnePointMove) {

 var onePointDiffX = e.touches[0].pageX * 2 - onePoint.x

 var onePointDiffY = e.touches[0].pageY * 2 - onePoint.y

      that.setData({

        msg: '单点移动',

        left: that.data.left + onePointDiffX,

        top: that.data.top + onePointDiffY

 })

      onePoint.x = e.touches[0].pageX * 2

      onePoint.y = e.touches[0].pageY * 2

 }else if (e.touches.length > 1) {

 var preTwoPoint = JSON.parse(JSON.stringify(twoPoint))

      twoPoint.x1 = e.touches[0].pageX * 2

      twoPoint.y1 = e.touches[0].pageY * 2

      twoPoint.x2 = e.touches[1].pageX * 2

      twoPoint.y2 = e.touches[1].pageY * 2

 // 计算角度,旋转(优先)

 var perAngle = Math.atan((preTwoPoint.y1 - preTwoPoint.y2)/(preTwoPoint.x1 - preTwoPoint.x2))*180/Math.PI

 var curAngle = Math.atan((twoPoint.y1 - twoPoint.y2)/(twoPoint.x1 - twoPoint.x2))*180/Math.PI

 if (Math.abs(perAngle - curAngle) > 1) {

        that.setData({

          msg: '旋转',

          rotate: that.data.rotate + (curAngle - perAngle)

 })

 }else {

 // 计算距离,缩放

 var preDistance = Math.sqrt(Math.pow((preTwoPoint.x1 - preTwoPoint.x2), 2) + Math.pow((preTwoPoint.y1 - preTwoPoint.y2), 2))

 var curDistance = Math.sqrt(Math.pow((twoPoint.x1 - twoPoint.x2), 2) + Math.pow((twoPoint.y1 - twoPoint.y2), 2))

        that.setData({

          msg: '缩放',

          scale: that.data.scale + (curDistance - preDistance) * 0.005

 })

 }

 }

 },

  touchend: function(e) {

 var that = this

    canOnePointMove = false

 }

})

json部分:

"navigationBarTitleText": "识别手势",

 "navigationBarTextStyle":"black",

 "navigationBarBackgroundColor": "#FFF",

 "disableScroll": true

专栏作家

honey缘木鱼。小程序社区博主,坚持原创分享技术博文。

本文原创发布于小程序社区。未经许可,禁止转载

原文地址:小程序的拖拽、缩放和旋转手势-微信小程序联盟/博主专区-微信小程序开发社区-微信小程序联盟

相关文章:

微信小程序之『仿 QQ 消息气泡拖拽消失』

微信小程序图片拖拽

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 1月2日更新demo 微信小程序学习用demo:todolist,带简易后端 微信小程序完整demo:游轮中心,富...
    Programmer客栈阅读 31,737评论 1 34
  • 微信小程序正式公测,张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) ... 前言:新人第一坑,跳坑指...
    米饭超人阅读 7,817评论 0 25
  • 单级泵 第一步:拆掉电机 第二步:松掉泵侧地脚和泵壳螺栓(外圈) 第三步:将泵侧拿回钳工间 第四步:用管钳卡住轴,...
    蒋介甫阅读 2,419评论 1 0
  • 相信自律这个词大家都已非常熟悉了,可能我们每天都会看到这两个字,亦或每天都会看到这个主题的文章,但是真正能...
    小小熊丶阅读 1,116评论 0 4
  • 近海风光钟神秀,慕名游览进画廊。 胜景久驻冬阳暖,美目常忘绒衣凉。 寒风吹皱碧波漾,浮光掠影心神爽。 频照顾盼山水...
    青荷园阅读 329评论 2 8