神才
神才
  • 发布:2014-09-05 22:36
  • 更新:2015-02-25 20:18
  • 阅读:4752

Android不支持swipe手势么?

分类:MUI

试了
{{{
swipeleft 向左滑动
swiperight 向右滑动
swipeup 向上滑动
swipedown 向下滑动
}}}
都不行

2014-09-05 22:36 负责人:无 分享
已邀请:
rooanlee

rooanlee

我的都行,你怎么试的哦

神才

神才 (作者)


我是这么试的。

{{{
<!DOCTYPE html>
<html>

<head>  
    <meta charset="utf-8">  
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
    <title></title>  
    <script src="js/mui.min.js"></script>  
    <link href="css/mui.min.css" rel="stylesheet" />  
    <style>  
        .touch {  
            position: absolute;  
            top: 0;  
            right: 0;  
            bottom: 0;  
            left: 0;  
            z-index: 1002;  
            background: #000000;  
            transition: background 100ms ease;  
            -webkit-backface-visibility: hidden;  
            -webkit-tap-highlight-color: transparent;  
        }  
    </style>  
</head>  

<body>  
    <div id="touch" class="touch">  
        123  
    </div>  
    <script type="text/javascript" charset="utf-8">  
        mui.init({  
            gestureConfig: {  
                tap: true,  
                doubletap: true,  
                longtap: true,  
                swipe: true,  
                drag: true  
            }  
        });  
        document.getElementById('touch').addEventListener('tap', function(event) {  
            console.log('tap');  
        });  
        document.getElementById('touch').addEventListener('doubletap', function(event) {  
            console.log('doubletap');  
        });  
        document.getElementById('touch').addEventListener('longtap', function(event) {  
            console.log('longtap');  
        });  
        document.getElementById('touch').addEventListener('swipeleft', function(event) {  
            console.log('swipeleft');  
        });  
        document.getElementById('touch').addEventListener('swiperight', function(event) {  
            console.log('swiperight');  
        });  
        document.getElementById('touch').addEventListener('swipeup', function(event) {  
            console.log('swipeup');  
        });  
        document.getElementById('touch').addEventListener('swipedown', function(event) {  
            console.log('swipedown');  
        });  
        document.getElementById('touch').addEventListener('dragstart', function(event) {  
            console.log('dragstart');  
        });  
        document.getElementById('touch').addEventListener('drag', function(event) {  
            console.log('drag');  
        });  
        document.getElementById('touch').addEventListener('dragend', function(event) {  
            console.log('dragend');  
        });  
    </script>  
</body>  

</html>
}}}

神才

神才 (作者)

Android 版本是4.04

神才

神才 (作者)

测试了,Android 4.4\2.3都响应dragend,4.04不响应dragend。Android 4.4\2.3用swipe就没问题。4.04就不行。

DCloud_UNI_CHB

DCloud_UNI_CHB

能把你上面的日志结果截个图吗?
swipe和drag是互斥的,不会同时发生,若发生了swipe事件,则不会再有dragend事件发生。

DCloud_UNI_FXY

DCloud_UNI_FXY

补充说明一下。

对于一个swipe事件来说。触发的顺序

dragstart--->drag--->drag[left|right|up|down]--->swipe[left|right|up|down]--->dragend

简单地说,swipe事件一定会触发drag事件。而drag事件不一定触发swipe事件

1.dragstart,drag,drag[left|right|up|down]这些事件是在原生touchmove的时候触发的,
在touchmove过程中,dragstart仅触发一次,drag和drag[left|right|up|down]可能触发多次
2.swipe[left|right|up|down],dragend事件是在原生touchend|touchcancel时触发。

  1. tap,doubletap仅在原生touchend触发
    4.longtap只要长按不动就会触发
    可通过下列代码测试事件触发情况:
    {{{
    mui.init({
    gestureConfig: {
    tap: true,
    doubletap: true,
    longtap: true,
    swipe: true,
    drag: true
    }
    });
    var touch = document.getElementById('touch');
    mui.each(['tap', 'doubletap', 'longtap', 'dragstart', 'drag', 'dragleft', 'dragright', 'dragup', 'dragdown', 'dragend', 'swipeleft', 'swiperight', 'swipeup', 'swipedown'], function(index, event) {
    touch.addEventListener(event, function(e) {
    console.log(e.type);
    });
    });
    }}}
  • j***@163.com

    您好,还有一个问题,$(".swiper-container").on("swipeleft",".swiper-slide",function(event){

    console.log("swipeleft")

    }),只触发swipeup和swipedown事件,但是swipeleft和swiperight都触发不了,是什么原因呢

    2017-11-13 12:01

这个人很懒

这个人很懒

2.swipe[left|right|up|down],dragend事件是在原生touchend|touchcancel时触发。
对于这个问题, 在手机上测试了一下, 感觉swipe事件不是总会触发, 有的时候轻快的右划会返回, 但有的时候却不返回, 怎么确认一下这个是不是有bug?

这个人很懒

这个人很懒

用前面同学贴的示例代码测试了一下, 确实swipe[left/right/up/down]不是很稳定, 有的时候会触发, 有的时候不触发

DCloud_UNI_FXY

DCloud_UNI_FXY

swipe是快速滑动,如果滑动速度慢,是不会触发的。从touch开始到touch结束300ms内的滑动。会触发swipe。大于300ms则不会触发

  • 这个人很懒

    测试过很多次, 我的结论是这个事件不太稳定:) 我也看了那块代码, 感觉逻辑问题不是太大, 可能健壮性需要想想办法, 或者再找找为啥偶尔不触发swipe吧

    2014-11-12 13:26

  • DCloud_UNI_FXY

    我这里测试暂时无法重现该问题,你可以在我们框架里触发swipe的地方,打印一下触发swipe的几个条件参数,然后看看是因为什么没有触发。

    2014-11-12 19:27

  • 这个人很懒

    回复 DCloud_UNI_FXY:发现了是distance不太对劲, 按说我划拉了够远了, 只能再看看这个距离是咋算的了

    2014-11-13 16:32

  • 这个人很懒

    回复 DCloud_UNI_FXY:我调整了一下swipeMinDistince: 10(old value 18), angle = [-25, 25], 原值[-15, 15], 这样操作swipeback比较稳定, 有没有什么副作用?

    2014-11-13 16:48

这个人很懒

这个人很懒

调试了一下, distance计算的貌似不太对劲

DCloud_UNI_FXY

DCloud_UNI_FXY

distance是通过move的坐标和start的坐标进行计算的
distance的算法如下:

var getDistance = function(p1, p2) {  
        var x = p2.x - p1.x;  
        var y = p2.y - p1.y;  
        return Math.sqrt((x * x) + (y * y));  
    };
  • 这个人很懒

    算法看起来没有什么问题, 但偶尔不符合操作的预期, 我划拉很长, 有的时候这个distance却不大

    2014-11-13 17:32

  • DCloud_UNI_FXY

    滑动很长。但distance不大的问题,有可能是因为操作习惯,比如你认为你滑了一次,但实际上设备触发了多轮(start-move*-end|cancel).你打下日志,看看你操作的时候,是否触发了多次touchstart

    2014-11-13 17:56

陶妖兽

陶妖兽

我只能说,swipe事件真的是很不稳定,有的时候划个好几次都划不出来,领导和客户根本不能接受,现在我还在找解决方法

DCloud_UNI_FXY

DCloud_UNI_FXY

你在hello-mui的list中的右滑,左滑菜单测试,也不稳定?

你可以把你的代码贴出来,我测试一下。

  • 陶妖兽

    我确实在hello mui中测试,我用的是Nexus 5,右滑偶尔会不触发,需要多次滑动,是速度太慢或者距离太短?但是我平常用使用就是这样的滑动速度

    2015-02-26 10:55

  • DCloud_UNI_FXY

    你测试的内容是什么?在哪个具体的demo里测试的?

    2015-02-26 13:12

该问题目前已经被锁定, 无法添加新回复