touch多点触摸事件

不问归期 提交于 2021-01-18 05:53:12

touch--单点

targetTouches、 changeTouches

多点:

targetTouches--当前物体上的手指数

*不同物体上的手指不会互相干扰

 

不需要做多点触摸的时候---平均值:

x=∑ 所有手指x /n
y=∑ 所有手指y /n

手势识别:
1.
2.

--------------------------------------------------------------------------------

多点触摸:
1.避免影响——消除干扰
平均坐标
2.需要多点——手势
i.旋转 后角度-前角度
ii.缩放 后距离/前距离

--------------------------------------------------------------------------------

Math.atan(b/a);
Math.atan2(b, a);

--------------------------------------------------------------------------------

角度:360
弧度:2·PI

360角度=2PI弧度
1角度=PI/180弧度
n角度=n*PI/180弧度

2PI弧度=360角度
1弧度=180/PI角度
n弧度=n*180/PI角度

--------------------------------------------------------------------------------

1.思路:
旋转 角度-角度
缩放 距离/距离
2.弧度:
弧度 换算 角度

--------------------------------------------------------------------------------

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
    <title></title>
    <style media="screen">
    body {height:2000px;}
    .box {width:200px; height:200px; background:#CCC; border:1px solid black; position:absolute; line-height:200px; text-align:center; font-size:40px; left:50%; top:150px; margin-left:-100px; transform: rotate(0deg)}
    </style>
    <script>
    function calcAng(touch1, touch2){
      let x=touch1.clientX-touch2.clientX;
      let y=touch1.clientY-touch2.clientY;

      return Math.atan2(y, x)*180/Math.PI;
    }

    window.onload=function (){
      let oBox=document.getElementsByClassName('box')[0];

      let ang1,ang2;
      let ang=0,old_ang;

      document.addEventListener('touchstart', function (ev){
        if(ev.targetTouches.length>=2){
          ang1=calcAng(ev.targetTouches[0], ev.targetTouches[1]);
          old_ang=ang;
        }
      }, false);

      document.addEventListener('touchmove', function (ev){
        if(ev.targetTouches.length>=2){
          ang2=calcAng(ev.targetTouches[0], ev.targetTouches[1]);

          ang=old_ang+ang2-ang1;

          oBox.style.transform=`rotate(${ang}deg)`;
        }
      }, false);
    };
    </script>
  </head>
  <body>
    <input type="text" name="" value="">
    <input type="button" value="按钮" onclick="document.querySelector('.box').style.background='yellow';">
    <div class="box">asdfasdf</div>
  </body>
</html>

 缩放

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
    <title></title>
    <style media="screen">
    body {height:2000px;}
    .box {width:200px; height:200px; background:#CCC; border:1px solid black; position:absolute; line-height:200px; text-align:center; font-size:40px; left:50%; top:150px; margin-left:-100px; transform:scale(1);}
    </style>
    <script>
    function calcDistance(touch1, touch2){
      return Math.sqrt(Math.pow(touch1.clientX-touch2.clientX, 2), Math.pow(touch1.clientY-touch2.clientY, 2));
    }
    window.onload=function (){
      let oBox=document.getElementsByClassName('box')[0];

      let dis1,dis2;
      let scale=1.0,old_scale;

      document.addEventListener('touchstart', function (ev){
        if(ev.targetTouches.length>=2){
          dis1=calcDistance(ev.targetTouches[0], ev.targetTouches[1]);

          old_scale=scale;
        }
      }, false);

      document.addEventListener('touchmove', function (ev){
        if(ev.targetTouches.length>=2){
          dis2=calcDistance(ev.targetTouches[0], ev.targetTouches[1]);

          scale=old_scale*dis2/dis1;

          oBox.style.transform=`scale(${scale})`;
        }
      }, false);
    };
    </script>
  </head>
  <body>
    <div class="box">asdfasdf</div>
  </body>
</html>

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!