在开发中,有时会遇到像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

微信小程序的拖拽、缩放和旋转手势的更多相关文章

  1. 微信小程序之实现页面缩放式侧滑效果

    效果图: 实现原理:点击按钮,往需要动画的div中添加或移除拥有动画效果的class. 由于微信小程序中不能操作page这个根节点,所以,只有用一个div(view)来模仿page根节点. 1.结构 ...

  2. 微信小程序--图片相关问题合辑

    图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.preview ...

  3. 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...

  4. 微信小程序 -- 基于 movable-view 实现拖拽排序

    微信小程序 -- 基于 movable-view 实现拖拽排序 项目基于colorui样式组件 ColorUI组件库 (color-ui.com) 1.实现效果 2. 设计思路 movable-vie ...

  5. 微信小程序裁剪图片成圆形

    代码地址如下:http://www.demodashi.com/demo/14453.html 前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在gith ...

  6. 微信小程序之裁剪图片成圆形

    前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在github上看了一些例子,一般剪裁图片用的都是方形,所以自己打算写一个小组件,可以把图片剪裁成圆形,主 ...

  7. 微信小程序开发工具测评

    1月9日微信小程序正式上线.很多企业都希望能在这个.但是在技术开发的问题上,却不知道该如何下手.经过一些程序员不辞辛苦连夜测试,终于从十余款工具呕心沥血筛选出四款比较靠谱实用的微信小程序开发工具.接下 ...

  8. 微信小程序如何开发制作

    微信小程序如何开发制作 微容SMO是一款微信小程序的免费在线制作工具,用户在微容平台上无需编辑代码,可通过拖拽式操作即可完成小程序的制作,真正意义上实现了小程序零代码免费制作! 消除技术门槛:无需代码 ...

  9. 全栈开发工程师微信小程序-上(中)

    全栈开发工程师微信小程序-上(中) width: 750rpx; 750rpx代表与屏幕等宽,rpx的缩写responsive pixel,这个单位是可以根据屏幕大小进行自适应调整的像素单位. 小程序 ...

随机推荐

  1. 【POJ1011】Sticks

    [题目概括] 现在有\(n\)个长度不超过\(50\)的木棍,请你把这些小木棍拼成若干根长度相同的木棍. 请你最小化拼成后的长度. [思路要点] 考虑枚举最后的长度,然后判断是否可以,这样就不需要最优 ...

  2. SPP框架的基本使用

    入职两天 Day1.Day2: 学习SPP框架 SPP是什么? SPP提供了一系列的基础功能,是一个通用的网络服务器运行框架.主要由proxy,worker,controller三个模块组成.它提供A ...

  3. select和FD_SET等

    转自:http://blog.csdn.net/cstarbl/article/details/7645298 select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供sele ...

  4. ZOJ - 3780-Paint the Grid Again-(拓扑排序)

    Description Leo has a grid with N × N cells. He wants to paint each cell with a specific color (eith ...

  5. Jmeter连接Redis服务缓存

    1.添加线程组->Sampler->BeanShell Sampler,加入以下内容: import redis.clients.jedis.Jedis; import org.apach ...

  6. Android_(游戏)打飞机01:前言

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  7. 前后端分离,get请求导出

    [HttpGet] public HttpResponseMessage Export(string obj) { string eventType = string.Empty; string ex ...

  8. C++入门经典-例5.15-回收动态内存的一般处理步骤

    1:正确的步骤应该是如下代码所示: // 5.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostrea ...

  9. Ruby的异常处理

    Ruby在处理0.1+0.2是会出现精度问题: 许多语言都有类似问题,详见网址:http://0.30000000000000004.com/ Ruby的异常处理 如果异常处理范围是整个方法体,可以省 ...

  10. 2.进行model和log的路径创建

    第一步:使用datetime.strftime(datetime.now(), '%Y%m%d-%H%M%S') 用于生成当前时间 第二步: 使用os.path.join() 将文件的路径与subdi ...