MyException - 我的异常网
当前位置:我的异常网» Android » android hybrid 中手势如何避免

android hybrid 中手势如何避免

www.MyException.Cn  网友分享于:2013-08-09  浏览:0次
android hybrid 中手势如何处理

      hybrid 开发关于手势的思考

       手势非常总要,尤其是在app应用中,大量的app提供的右滑退出等功能培养了用户习惯,所以我们在开发app的时候考虑到用户体验最好也要加入类似功能,但是具体到app 中或者是hybrid 下的webview 中,里边可很有可能需要处理横向滚动处理,例如广告,iscroll 控件,swiper 控件,等等也会需要横向滑动手势,如果做到两个互不干扰,这是需要我们思考的一个问题,下图就是一个带有滑动切换广告的banner ,

       



 

 

想解决这个问题,android 是否原始支持手势退出,这个我研究一下好像没有原生接口来支持,这样一来我们就需要通过自己实现功能来处理滑动退出,参考了一下主流app 的操作习惯,但是我们需要考虑几点,首要问题就是如何判断用户意图是要退出当前页面,通过对其他app和ios 一些应用的研究,当用户从屏幕最左侧作为起始点滑动的时候是明显具有退出意图,所以,我们可以以此作为核心参考依据,划定一个滑动范围作为退出条件

1.滑动起始范围

2.滑动速度

因为android只有2d接口所以没法判断用户按压的力度,只能通过二维的手势做简单的判断

这里我们需要一个android skd 中一个 非常总要跟用户点击操作有关的接口

 

gestureDetector=new GestureDetector(GestureTest1Activity.this,onGestureListener);
/**
   @param e1 :起始移动点
   @param e2 :结束时的移动点
   @param velocityX x轴的移动速度
   @param velocityY y轴的移动速度

 

*/
public boolean onFling(android.view.MotionEvent e1, android.view.MotionEvent e2, float velocityX, float velocityY) {
System.out.println("onFling................"); 
			float x = e2.getX() - e1.getX();//滑动后的x值减去滑动前的x值 就是滑动的横向水平距离(x)  
			float y = e2.getY() - e1.getY();//滑动后的y值减去滑动前的y值 就是滑动的纵向垂直距离(y)  
			float startX=e1.getX();
            
			 System.out.println(e1.getX()+"~~~~~~~~~~~~~~~~~~~~~~");
             //如果滑动的横向距离大于100,表明是右滑了,那么就执行下面的方法,可以是关闭当前的activity  
             if (x > 100&&startX<15) {  
                 doResult(RIGHT);  
                 Log.w("tag", "RIGHT>" + x);  
             }  
             //如果滑动的横向距离大于100,表明是左滑了(因为左滑为负数,所以距离大于100就是x值小于-100)  
             if (x < -100) {  
                 Log.w("tag", "LEFT>" + x);  
                 doResult(LEFT);  
             }  
            
             return true;  
}

  GestureDetector 中有很多跟手势相关的接口例如

 onFling 和点,滑动 有关,包含 touch start ,touch move ,touch end

 onDoubleTap 双击相关

 onScroll 滑动相关

  

 这样我们就开发完成android native 下关于右滑退出的功能,这里需要有个概念就是,activity 的事件

 分发机制。

 @Override
 public boolean dispatchTouchEvent(android.view.MotionEvent event) {
   // 在事件分发中把事件传给手势组件处理
   return gestureDetector.onTouchEvent(event);
 }

  当我们希望使用手势相关的功能时候都要处理这个事件分发,重写dispatchTouchEvent 把事件分发中的event 交给 gestureDetector 处理,

 这里我简单描述一下android的事件分发机制,android 的事件机制,与浏览器的事件有所不同

浏览器的事件传播机制的核心是基于事件捕获,和事件冒泡

android 的事件传播机制是基于事件分发,分发器处理是在activity 上,

为什么需要这个事件机制处理,而且地位非常重要处于核心位置,我们深层思考不管是web,还是android 的view 都是一个视觉是二维,本质是三维的结构,如果view 本质都是二维的话,那么事件机制就没那么重要了,因为没有父子关系也就没有了事件传播,独立view 没有相互关系也缺乏传播的依据,我们在开发view 的时候不管是div 的嵌套关系,还是android RelativeLayout 都是父子嵌套的关系,



 

和android 的事件系统作对比



 

 

其实很相像。

 

所以我们只需要在activity 中做手势处理,其他子组件做正常事件分发,这样就能既满足整个activity 的右滑手势退出,而且webview 中的其他事件也能正常运行

 

 @Override
	 public boolean dispatchTouchEvent(android.view.MotionEvent event) {
		 // 調用父級會自動分發事件,否則字控件就沒有事件響應了,
		 	super.dispatchTouchEvent(event);
			switch (event.getAction()) {
				case android.view.MotionEvent.ACTION_SCROLL : 
					System.out.println("scroll................................");
					break;
				case android.view.MotionEvent.ACTION_DOWN: 
					System.out.println("ACTION_DOWN................................");
					break;
				case android.view.MotionEvent.ACTION_MOVE : 
					System.out.println("ACTION_MOVE................................");
					break;
				case android.view.MotionEvent.ACTION_UP : 
					System.out.println("ACTION_UP................................");
					break;
				default:
					break;
			}
			//wv.onTouchEvent(event); 
			return gestureDetector.onTouchEvent(event);
	 };

 注:在重写dispatchTouchEvent 事件时候一定要调用 super.dispatchTouchEvent(event); 父类正常的事件分发,否则我们重写的事件分发原始正常的分发过程就中断了,

   我们也可以封装成一个JavaScriptInterface 接口暴露给webview 的js 使用,可以让用户通过设置来选择这个activity 是否支持手势退出

  

 

 Hybird 开发中有很多地方需要处理

1.native 渲染和webview 中渲染不同步,大量的hybrid应用中会使用头部native ,内容webview 导致很多设置会不生效

2.js 的缓存管理 例如localstorage 和缓存的js文件

3.跳转路径管理,传参等问题

4.js hybrid 交互中值返回的问题

 

 

 

 

 

文章评论

每天工作4小时的程序员
每天工作4小时的程序员
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
中美印日四国程序员比较
中美印日四国程序员比较
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员都该阅读的书
程序员都该阅读的书
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
漫画:程序员的工作
漫画:程序员的工作
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Java程序员必看电影
Java程序员必看电影
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
总结2014中国互联网十大段子
总结2014中国互联网十大段子
那些争议最大的编程观点
那些争议最大的编程观点
程序员和编码员之间的区别
程序员和编码员之间的区别
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
代码女神横空出世
代码女神横空出世
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
我的丈夫是个程序员
我的丈夫是个程序员
程序员的鄙视链
程序员的鄙视链
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
编程语言是女人
编程语言是女人
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
10个调试和排错的小建议
10个调试和排错的小建议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
如何成为一名黑客
如何成为一名黑客
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我是如何打败拖延症的
我是如何打败拖延症的
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
旅行,写作,编程
旅行,写作,编程
 程序员的样子
程序员的样子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老程序员的下场
老程序员的下场
一个程序员的时间管理
一个程序员的时间管理
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有