最近在做个混合app , 用html做页面,然后通过webview嵌套在activity中,效果是这样:

开始还是比较顺利,增加了菜单退出按钮,返回键页面回退功能,页面加载显示加载图标(在app端实现,本来是为了增强用户体验,在页面加载的时候可以显示一个转动的图标,但是到了最后,这个功能反而成了影响用户体验的鸡肋, 因为页面中有很多图片, 每次页面显示出来后,图片还没加载完毕,所以加载图标一直在那里转动,影响了用户浏览页面,最后将此功能删除了)。

以上基本具备了混合app的雏形,可以拿出来忽悠一下客户了。

但是本着追求完美,不断创新的自虐精神,我又想在app上增加左右滑动可使页面前进和倒退的功能。其实在app上实现这些不难,在webview加载一个监听器,监听左右滑动事件,然后调用webview的 goback() 和 goForward就欧了,自己重载一个webview就可以实现,代码如下

public class cbWebView extends WebView {

    private GestureDetector gestureDetector;
private Context cb; public cbWebView(Context context) {
super(context);
cb = context;
gestureDetector = new GestureDetector(this.getContext(),
onGestureListener);
} public cbWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);
cb = context;
gestureDetector = new GestureDetector(this.getContext(),
onGestureListener);
} public cbWebView(Context context, AttributeSet attrs) { super(context, attrs);
cb = context;
gestureDetector = new GestureDetector(this.getContext(),
onGestureListener);
} // 重载滑动事件
@Override
public boolean onTouchEvent(MotionEvent evt) {
gestureDetector.onTouchEvent(evt);
return super.onTouchEvent(evt);
} private GestureDetector.OnGestureListener onGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) { float x = e2.getX() - e1.getX();
float y = e2.getY() - e1.getY(); if (x > 100) {
// 右滑 事件
Toast.makeText(cb, "右滑动2", Toast.LENGTH_LONG).show();
cbWebView.this.goBack();
} else if (x < -100) {
// 左滑事件
Toast.makeText(cb, "左滑动2", Toast.LENGTH_LONG).show();
cbWebView.this.goForward();
} return true;
}
};
}

之后坑爹的问题来了,因为页面中有个轮播图片,也是通过左右滑动切换图片,这就造成了,我滑动轮播图片的时候,也会触发webview的左右滑动事件,这可玩大了,本来只想滑动一下轮播图片,结果跳到了另外的一个页面......

我想造成这个问题的原因是,在html中的滑动事件,顺利的传送到了webview上。 我在网上查了很多资料,一直也没有好的解决办法,http://www.eoeandroid.com/thread-313541-1-1.html 这哥们碰到和我类似的问题,到目前也还没解决。但是这个问题肯定是可以解决的, 我下载了几个浏览器,UCWEB 、qq浏览器、360浏览器可以实现滑动切换页面,并且不与html中的touch事件冲突,android自带浏览器和遨游浏览器没有实现左右滑动切换功能。也许UCweb 这些浏览器没有使用webkit内核,也可能有什么其他高明的解决办法我们不知道。

但是不实现这个功能,总是不甘心,于是我又在baidu上一顿乱找,无意间看到这篇文章让我灵光一现 
http://blog.csdn.net/wangtingshuai/article/details/8635787  这篇文章讲的是 ”响应webview中的图片点击事件“,我好像找到了救命稻草,既然能够响应点击事件,那肯定也可以响应 ontouch事件,我只需要在轮播图片的touch事件中关闭webview的滑动响应就可以了(不要告诉我你不知道js与webview怎么通信, 网上教程有很多,自己看去)。

文章中的代码

// 注入js函数监听
private void addImageClickListner() {
// 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,函数的功能是在图片点击的时候调用本地java接口并传递url过去
contentWebView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"for(var i=0;i<objs.length;i++) " +
"{"
+ " objs[i].onclick=function() " +
" { "
+ " window.imagelistner.openImage(this.src); " +
" } " +
"}" +
"})()");
}

经过改装后:

// 注入js函数监听
private void addImageClickListner() {
// 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,函数的功能是在图片点击的时候调用本地java接口并传递url过去
mWebView.loadUrl("javascript:(function(){"
+ "var objs = $('.swiper-container'); " //轮播图片的div容器,
+ "for(var i=0;i<objs.length;i++) " + "{"
+ " objs[i].ontouchmove=function() " + " { "
+ " window.imagelistner.closetouch(); "
+ " return false; } "
+ "}" + "var objs = $('body'); " //点击任何地方 , 系统开始可以接受滚动
+ "for(var i=0;i<objs.length;i++) " + "{"
+ " objs[i].ontouchstart=function() " + " { "
+ " window.imagelistner.opentouch(); "
+ " return false; } "
+ "}" + "})()");
}

经过一番折,腾终于不负众望,达到了预期目标。 这里也有一个小瑕疵, "var objs = $('.swiper-container'); "  在js注入时指定了轮播的div ,缺少通用性。

目前只能做到这一步 ,这是我解决此类问题的一个另类思路,如果有更好的方法,还请高人告知,不甚感激!

webview滑动事件 与内部html左右滑动事件冲突问题的解决办法的更多相关文章

  1. ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法

    ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...

  2. Android ScrollView内部组件设置android:layout_height="fill_parent"无效的解决办法

    问题:scrollview内部组件都设置了android:layout_height="fill_parent"却没有效果. 解决办法:设置scrollview的fillViewp ...

  3. Vue事件总线(eventBus)$on()会多次触发解决办法

    项目中使用了事件总线eventBus来进行两个组件间的通信, 使用方法是是建立eventBus.js文件,暴露一个空的Vue实例,如下: import Vue from 'vue'export def ...

  4. jeecg3.8popup弹出窗口触发失去焦点事件,引发验证弹窗,影响体验问题的解决办法

    在初始化表单的代码中添加以下加粗部分,有几个popup就定义几个标志位,主要是防止第一次失去焦点时候的弹窗(此时还未来得及选择),提交表单的时候还是会正常校验的. //popup触发失去焦点事件,设置 ...

  5. IE 11 回车事件代码不起作用但是在chrom可以正常运行解决办法

    今天遇到这个问题,搞半天开始以为是代码写错了,后面拿到chrom上执行发现是正常的,就是这段代码 function EnterPress(){          if(event.keyCode == ...

  6. WebView加载本地html、js文件常见问题及解决办法

    声明:基于android studio平台,php语言搭建服务器 目录: 一.JavaScript脚本语言没有反应 二.alert无法弹出 三.html页面之间不能跳转 四.屏幕缩放没有达到预期效果 ...

  7. append()方法生成的元素绑定的事件失效解决办法

    我使用append()方法动态生成的a链接的click事件没有起效果,查找了资料,了解到,我使用的onclick方法绑定的事件对动态生成的元素是无效的,解决办法如下: 使用事件委托,并且要用on来绑定 ...

  8. Android webview clearHistory 不符合逾期的解决办法

    目前在业务开发中有这么一个需求,切换不同的 Fragment, 切换回 WebView 的Fragment时候,要求是打开的初始页面,然后我在 onHiddenChanged() 方法中加载默认地址, ...

  9. input输入框file类型第二次不触发onchange事件的解决办法,简单有效

    在网上看了很多办法,现在将网上大部分说法总结如下: 网上说法: 原因:选择一次后onchange事件没有绑定到input标签上:    解决办法:拷贝一份input标签的副本,每次选择后对原input ...

随机推荐

  1. jdbc java数据库连接 3)Statement接口之执行DDL、DML、DQL

    |- Statement接口: 用于执行静态的sql语句 |- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML) |- ResultSet ...

  2. Mongodb的安装

    下载:http://www.mongodb.org/downloads mongodb-win32-x86_64-3.2.5-signed.msi   安装: 1.dos下切换至安装目录bin下: 2 ...

  3. js确认删除对话框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. jquery表格动态增删改及取数据绑定数据完整方案

    一 前言 上一篇Jquery遮罩插件,想罩哪就罩哪! 结尾的预告终于来了. 近期参与了一个针对内部员工个人信息收集的系统,其中有一个需求是在填写各个相关信息时,需要能动态的增加行当时公司有自己的解决方 ...

  5. 【Beta版本】七天冲刺——日志集合贴

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 Day1 Day2 Day3 Day ...

  6. Activity数据传递

    1.在启动界面里通过intent调用方法putExtra添加欲携带数据 2.在被启动界面里通过getIntent方法获取Intent对象 3.通过intent的getXxxExtra方法获取对应的数据

  7. 10 行 Python 代码写的模糊查询

    导语: 模糊匹配可以算是现代编辑器(在选择要打开的文件时)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择. 样例如下: Vim (Ctrl-P ...

  8. 顺序表java实现

    public class SeqList { Object[] data; int maxSize; int length; public SeqList(int maxSize) { this.ma ...

  9. Angular 2 - 5 分钟快速入门

    原文地址: https://angular.io/docs/ts/latest/quickstart.html 让我们从 0 开始创建一个简单的 Angular 2 应用. 下载任何版本的 angul ...

  10. 控件之媒体控件: Image, MediaElement

    Image - 图片控件 MediaElement - 播放视频或音频的控件 示例1.Image 的 DemoImageDemo.xaml <Page x:Class="XamlDem ...