hammer实现拖拽旋转缩放功能
效果:
首先下载hammer插件http://hammerjs.github.io/
html部分:
<script type="text/javascript" src="js/hammer.min.js"></script>
<div class="resultCon">
<p>人景合成图:</p>
<div class="resultImgCon">
<!--背景图-->
<img src="img/beach.jpg" class="resultBg"/>
<!--人物抠图暂时不知道尺寸-->
<img src="img/shape.png" class="resultP draggable" id="move-box" />
</div>
</div>
js部分:
<script>
var reqAnimationFrame = (function () {
return window[Hammer.prefixed(window, 'requestAnimationFrame')] || function (callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
var el = document.querySelector("#move-box");
var START_X = Math.round((window.innerWidth - el.offsetWidth) / 2);
var START_Y = Math.round((window.innerHeight - el.offsetHeight) / 2)-50;
var ticking = false;
var transform; //图像效果
var timer;
var initAngle = 0; //旋转角度
var initScale = 1; //放大倍数
var mc = new Hammer.Manager(el); //用管理器 可以同时触发旋转 拖拽 移动
//var mc = new Hammer(el); //旋转和移动互斥
/**
ev.srcEvent.type touchstart touchend touchmove
ev.deltaX 手势移动位移变量
*/
mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
mc.add(new Hammer.Rotate({ threshold: 0 })).recognizeWith(mc.get('pan'));
mc.add(new Hammer.Pinch({ threshold: 0 })).recognizeWith([mc.get('pan'), mc.get('rotate')]);
//结束时做一些处理
mc.on("hammer.input", function(ev) {
if(ev.isFinal) {
console.log(START_X+" "+transform.translate.x +" "+ev.deltaX);
START_X = transform.translate.x ;
START_Y = transform.translate.y ;
}
});
mc.on("panstart panmove", onPan);
mc.on("rotatestart rotatemove rotateend", onRotate);
mc.on("pinchstart pinchmove", onPinch);
/**
第二次进入拖拽时 delta位移重置
移动时 初始位置startxy不动。delta增加
*/
function onPan(ev){
if(!ev.isFinal) {
el.className = '';
console.log(START_X +" "+ START_Y +" | "+ev.deltaX +" "+ ev.deltaY);
transform.translate = {
x: START_X + ev.deltaX,
y: START_Y + ev.deltaY
};
requestElementUpdate();
}
}
function onPinch(ev){
if(ev.type == 'pinchstart') {
initScale = transform.scale || 1;
}
el.className = '';
transform.scale = initScale * ev.scale;
requestElementUpdate();
}
//旋转相关
var preAngle =0 ;
var tempAngleFlag=0;
var deltaAngle = 0;
var startRotateAngle = 0;
function onRotate(ev) {
//点下第二个触控点时触发
if(ev.type == 'rotatestart') {
startRotateAngle = ev.rotation ;
tempAngleFlag = 0 ;
}
if(ev.type == 'rotatemove'){
if(tempAngleFlag == 0){
preAngle = startRotateAngle;
tempAngleFlag ++;
}else{
deltaAngle = ev.rotation - preAngle;
el.className = '';
transform.rz = 1; //非0 垂直xy轴
transform.angle =initAngle + deltaAngle;
requestElementUpdate();
}
}
//旋转结束 记录当前图片角度
if(ev.type =='rotateend'){
initAngle = transform.angle;
}
}
function updateElementTransform() {
var value = [
'translate3d(' + transform.translate.x + 'px, ' + transform.translate.y + 'px, 0)',
'scale(' + transform.scale + ', ' + transform.scale + ')',
'rotate3d('+ transform.rx +','+ transform.ry +','+ transform.rz +','+ transform.angle + 'deg)'
];
value = value.join(" ");
el.style.webkitTransform = value; /*为Chrome/Safari*/
el.style.mozTransform = value; /*为Firefox*/
el.style.transform = value; /*IE Opera?*/
ticking = false;
}
function requestElementUpdate() {
if(!ticking) {
reqAnimationFrame(updateElementTransform);
ticking = true;
}
}
/**
初始化设置
*/
function resetElement() {
el.className = 'animate';
transform = {
translate: { x: START_X, y: START_Y },
scale: 1,
angle: 0,
rx: 0,
ry: 0,
rz: 0
};
requestElementUpdate();
}
resetElement();
</script>
hammer实现拖拽旋转缩放功能相关推荐
- Android开发学习之ImageView手势拖拽、缩放、旋转
在Android应用中,图片随手势的拖拽.缩放.旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽.缩放.转转的TouchView. 一.实现原理 OnTouch ...
- 小程序的拖拽、缩放和旋转手势
在开发中,有时会遇到像App中的手势那样的效果,下面就仿照App实现了一下. wxml部分: <view class="touch-container"><vie ...
- vue-drag-resize实线页面的拖拽与缩放
使用vue-drag-resize实线页面的拖拽与缩放示例 <template><!--//需要给VueDragResize套一个div--><div id=" ...
- D3.js实现人物关系图谱有移动、拖拽、放大功能
原文链接:https://www.jianshu.com/p/d768505cab78 在此基础上加了点东西 实现了关系图的移动.拖拽.放大功能.以及数据的分类等等.代码稍显繁琐,另外案例中的d3.j ...
- java使用重绘实现拖动_原生JS使用Canvas实现拖拽式绘图功能
一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包含圆心坐标点和半径)等实体 2.原生JavaScript实现,不依赖任何第三方j ...
- C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
为什么80%的码农都做不了架构师?>>> 应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...
- java鼠标左键按下后拖动实现多选_鼠标拖拽多选功能
鼠标拖拽多选功能 *{ box-sizing:border-box; } ul{ width:500px; height:auto; margin:0; padding:20px; font-size ...
- 安卓开发仿微信图片拖拽_Android 仿微信朋友圈发表图片拖拽和删除功能
朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...
- Android 仿微信朋友圈发表图片拖拽和删除功能
朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...
最新文章
- 人类高质量AI训练方式:精细化数据集管理颠覆唯SOTA论
- 玩转Python!一文详述Python 的高性能使用技巧
- 如何检查你的项目是不是真的需要用到 AI?
- IOS8 PUSH解决方法
- 开始学习jQuery和准备工作
- Tips--解决安装Multisim时出现No software will be installed or removed无法安装的问题
- MATLAB字符数组和空数组
- Octopus系列之更新历史记录
- c语言switch工资怎么弄,超级新手,用switch写了个计算器程序,求指导
- 电脑怎么打印pdf文件,电脑中保存的pdf文件怎么打印
- 2020 智慧城市解决方案(智慧城市系统及相关技术)
- 本地安全策略 、 组策略
- 技术系列课回顾 | 网易云信变声技术之变调不变速算法
- 电影下载合并教程 (转)
- 现代化SharePoint经典网站
- 3D全景模型展示可视化技术演示
- Kylin RT OLAP reassign流程即重新分配replica_set 流程
- vue中使用echart实现三维立体图
- Android仿淘宝京东商品规格参数颜色筛选
- 正则表达式限制文本框只能输入中文或者英文或者数字
热门文章
- 中国第二家!理想汽车美股上市 特斯拉蔚来们怎么看?
- (八)Springboot整合Redis(RedisTemplate,使用Junit进行测试)
- 用极大似然法估计因子载荷矩阵_应用统计学与R语言实现学习笔记(十三)——因子分析...
- 马化腾深夜发出世纪灵魂拷问,程序员却把它玩坏了,这届网友我服了!
- Word字间距怎么调整?2023最新方法总结!
- 小鼠成纤维细胞NIH-3T3培养说明书
- 大数据告诉你2019年洗衣机品牌竞争力排行
- 项目四推荐系统源码(十二万字)
- 遥感图像处理实践课程任务::基于RSDIPLib搭建遥感图像处理应用程序
- 基于yolov5n的轻量级MSTAR遥感影像目标检测系统设计开发实战