效果:

首先下载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实现拖拽旋转缩放功能相关推荐

  1. Android开发学习之ImageView手势拖拽、缩放、旋转

    在Android应用中,图片随手势的拖拽.缩放.旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽.缩放.转转的TouchView. 一.实现原理 OnTouch ...

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

    在开发中,有时会遇到像App中的手势那样的效果,下面就仿照App实现了一下. wxml部分: <view class="touch-container"><vie ...

  3. vue-drag-resize实线页面的拖拽与缩放

    使用vue-drag-resize实线页面的拖拽与缩放示例 <template><!--//需要给VueDragResize套一个div--><div id=" ...

  4. D3.js实现人物关系图谱有移动、拖拽、放大功能

    原文链接:https://www.jianshu.com/p/d768505cab78 在此基础上加了点东西 实现了关系图的移动.拖拽.放大功能.以及数据的分类等等.代码稍显繁琐,另外案例中的d3.j ...

  5. java使用重绘实现拖动_原生JS使用Canvas实现拖拽式绘图功能

    一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包含圆心坐标点和半径)等实体 2.原生JavaScript实现,不依赖任何第三方j ...

  6. C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    为什么80%的码农都做不了架构师?>>>    应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...

  7. java鼠标左键按下后拖动实现多选_鼠标拖拽多选功能

    鼠标拖拽多选功能 *{ box-sizing:border-box; } ul{ width:500px; height:auto; margin:0; padding:20px; font-size ...

  8. 安卓开发仿微信图片拖拽_Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

  9. Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

最新文章

  1. 人类高质量AI训练方式:精细化数据集管理颠覆唯SOTA论
  2. 玩转Python!一文详述Python 的高性能使用技巧
  3. 如何检查你的项目是不是真的需要用到 AI?
  4. IOS8 PUSH解决方法
  5. 开始学习jQuery和准备工作
  6. Tips--解决安装Multisim时出现No software will be installed or removed无法安装的问题
  7. MATLAB字符数组和空数组
  8. Octopus系列之更新历史记录
  9. c语言switch工资怎么弄,超级新手,用switch写了个计算器程序,求指导
  10. 电脑怎么打印pdf文件,电脑中保存的pdf文件怎么打印
  11. 2020 智慧城市解决方案(智慧城市系统及相关技术)
  12. 本地安全策略 、 组策略
  13. 技术系列课回顾 | 网易云信变声技术之变调不变速算法
  14. 电影下载合并教程 (转)
  15. 现代化SharePoint经典网站
  16. 3D全景模型展示可视化技术演示
  17. Kylin RT OLAP reassign流程即重新分配replica_set 流程
  18. vue中使用echart实现三维立体图
  19. Android仿淘宝京东商品规格参数颜色筛选
  20. 正则表达式限制文本框只能输入中文或者英文或者数字

热门文章

  1. 中国第二家!理想汽车美股上市 特斯拉蔚来们怎么看?
  2. (八)Springboot整合Redis(RedisTemplate,使用Junit进行测试)
  3. 用极大似然法估计因子载荷矩阵_应用统计学与R语言实现学习笔记(十三)——因子分析...
  4. 马化腾深夜发出世纪灵魂拷问,程序员却把它玩坏了,这届网友我服了!
  5. Word字间距怎么调整?2023最新方法总结!
  6. 小鼠成纤维细胞NIH-3T3培养说明书
  7. 大数据告诉你2019年洗衣机品牌竞争力排行
  8. 项目四推荐系统源码(十二万字)
  9. 遥感图像处理实践课程任务::基于RSDIPLib搭建遥感图像处理应用程序
  10. 基于yolov5n的轻量级MSTAR遥感影像目标检测系统设计开发实战