解决Android下元素滑动问题

移动端左右、上下滑动:
当页面中既需要页面滑动操作,又需要上下或左右滑动页面上的某个元素时,直接使用zepto中提供的swipe事件是不能直接达到目的的,原因如下:
(1)在Android低端机上touchEnd会不被触发。
(2)zepto中的swipe 事件通过 事件冒泡机制实现事件监听
在document上统一监听touchstart、 touchmove、 touchend, 然后判断是上下滑动还是左右滑动。 再判断document的touch事件是由哪个元素上的touch事件冒泡上来的, 再触发该元素上的滑动事件。
直接在某个元素上绑定swipe事件,会冒泡至body上,如果是上下滑动会触发页面滚动,导致在滑动元素的时候页面也在滚动。
滑动事件触发过程:
(1)IOS 上 当触发 "swipe"时, 依次产生如下事件: touchstart - > touchmove * 多次 - > touchend - > scroll
(2)Android4.x上touchend不触发-- > touchmove时, 阻止默认事件, touchend才会被触发
touchstart - > touchmove - > touchcancel - > scroll * 多次
并且在Android低版本上还会出现单击一下,会有位移差的现象。

所以,通过下面脚本重写swipe事件,解决上面的问题。

/**
 * 滑动事件   Android 4.0 will not fire touchend event
 */
define(function(require,exports,module){

     function SwipeEvent(selector){
        this.selector = selector;
        this.swipeLeftCallback = function(){};
        this.swipeRightCallback = function(){};
        this.swipeUpCallback = function(){};
        this.swipeDownCallback = function(){};
        this._initSwipe(selector);
    }
    SwipeEvent.prototype.bind = function(evtName,callback){
        switch(evtName){
            case "swipeLeft":
            this.swipeLeftCallback = callback;
            break;
            case "swipeRight":
            this.swipeRightCallback = callback;
            break;
            case "swipeUp":
            this.swipeUpCallback = callback;
            break;
            case "swipeDown":
            this.swipeDownCallback = callback;
            break;
        }
    };
    SwipeEvent.prototype._initSwipe = function(selector){
        var self = this;
        var startX, startY;
        var endX, endY;
        var distanceX, distanceY;
            $(selector).on(‘touchstart‘, function(event) {
                startX = event.targetTouches[0].clientX;  //位于当前DOM元素上手指的列表。
                startY = event.targetTouches[0].clientY;
            }).on("touchmove",function(event){
                endX = event.changedTouches[0].clientX;
                endY = event.changedTouches[0].clientY;   //涉及当前事件手指的列表。
                distanceX = Math.abs(startX - endX);
                distanceY = Math.abs(startY - endY);
                if(distanceX > 1 || distanceY > 1){  //判断是左右滑动或上下滑动,阻止默认事件  使android4 touchend生效
                    event.preventDefault();
                }
                event.stopPropagation();
            }).on(‘touchend‘, function(event) {
                endX = event.changedTouches[0].clientX;
                endY = event.changedTouches[0].clientY;
                distanceX = Math.abs(startX - endX);
                distanceY = Math.abs(startY - endY);
                if(distanceX > 10 || distanceY > 10){  //安卓4.X里,单击一次也会产生位移差
                    if (distanceX >= distanceY) {  //左右滑动
                        if(startX - endX > 0){
                            self.swipeLeftCallback(event);
                        }else if(startX - endX < 0){
                            self.swipeRightCallback(event);
                        }
                    }else{
                        if(startY - endY > 0){
                            self.swipeUpCallback(event);
                        }else if(startY - endY < 0){
                            self.swipeDownCallback(event);
                        }
                    }
                }
            });
    };
    module.exports =  SwipeEvent;
});

参考:http://www.cnblogs.com/ytu2010dt/p/5767491.html

http://www.myexception.cn/web/1874295.html

时间: 2024-10-12 19:02:34

解决Android下元素滑动问题的相关文章

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

ios下元素溢出设置 overflow:auto; 不能滑动解决办法

ios下元素溢出设置 overflow:auto; 不能滑动解决办法: overflow:auto; overflow-y:scroll; -webkit-overflow-scrolling:touch; height:200px;

解决IDEA下运行android项目 No resource found that matches the given name &#39;Theme.AppCompat.Light&#39;.

1.右击项目选择 解决IDEA下运行android项目 No resource found that matches the given name 'Theme.AppCompat.Light'.

Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉加载,而是针对下拉刷新上拉加载常用的一些应用场景就行了一些总结,包含了下拉刷新上拉加载过程中遇到的一些手势冲突问题的解决方法(只能算是抛砖引玉). 去年9月的时候,那时自己正在独立做Android项目.记得刚刚写完那个ListView列表页面(木有下拉刷新,上拉加载)

CSharp程序员学Android开发---3.Android内部元素不填充BUG

最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历时一个多月,4个人开发,最终行成一个可用的Demo,整体效果还非常不错.这其中借鉴了网上的“仿网易客户端的Demo”还有就是学习<疯狂Android>,收获颇多,这里利用几篇文章做一个项目经验总结,还有就是更多的从C# 程序员的观点来理解Android的一些异同之处. 文章目录: CSharp程序

解决Android LogCat 输出乱码的问题(转)

Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的. 可以使用adb的logcat 命令来查看系统日志缓冲区的内容,但是在实际操作时,会发现在CMD的DOS界面上面,使用logcat命令直接输出的中文内容是乱码.如下图: 而这个问题只出现在使用logcat将日志直接打印在当前的DOS窗口的时候会出现:而使用logcat将日志保存为文件,再使用文本编辑工具打开的则显示正常,如图. 很明显是由于DOS窗口显示的编码同logcat日志中不同导致的

Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉载入,而是针对下拉刷新上拉载入经常使用的一些应用场景即可了一些总结,包括了下拉刷新上拉载入过程中遇到的一些手势冲突问题的解决方法(仅仅能算是抛砖引玉). 去年9月的时候.那时自己正在独立做Android项目. 记得刚刚写完那个ListView列表页面(木有下拉刷新,上

Android模拟器鼠标滑动出现C问题的补充

网上有解决方法:http://blog.csdn.net/huang9012/article/details/18083037 刚刚转到Andriod上来,昨天把环境搭建好了,今天写一个短信群发的小应用,在部署安装到模拟器上时一切顺利,到模拟器上使用时,发现用鼠标滑动时,会自动的打开搜索应用的程序,并且会自己输入C这个字符,昨天都还好好的,今天使用起来就发现这样的问题. 反复的新建了很多个模拟器,开始还以为是权限和模拟器冲突导致的问题,后来换真机来部署,发现在真机下一切正常.很郁闷啊.... 今

阻止微信浏览器下拉滑动效果(ios11.3 橡皮筋效果)

在升级到 ios11.3 系统后,发现之前阻止页面滚动的代码e.preventDefault代码失效了.于是自己折腾了一番,找到了解决办法,分享给大家. 一.前言 浏览器在移动端有一个默认触摸滚动的效果,让我们感触最深的莫过于微信浏览器里面,下拉时自带橡皮筋的效果. 然而在开发的时候我们经常需要阻止此效果. 在此先直接给一个方案,直接加上下面的代码即可: document.body.addEventListener('touchmove', function (e) { e.preventDef