`
zha_zi
  • 浏览: 590232 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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 交互中值返回的问题

 

 

 

 

 

  • 大小: 106.1 KB
  • 大小: 22.9 KB
  • 大小: 139.1 KB
分享到:
评论

相关推荐

    Normalization-Android.rar

    在Android应用开发中,"Normalization-Android.rar" 文件可能是一个包含源代码和资源的压缩包,用于演示如何在混合(Hybrid)环境中实现Android应用的数据采集和上传功能,特别是在Hbuilder这个集成开发环境下。...

    Appium mac/android自动化

    文档中提到的Appium Girls学习指南主要面向初学者,为他们提供了一份详细的学习手册,内容涵盖了Appium的基本架构、使用IDE启动Appium Server、元素定位、编写测试脚本、手势操作和UIAutomator以及Hybrid框架的进阶...

    Android 自动化测试框架

    Android 自动化测试框架是开发过程中确保应用稳定性和功能完整性的关键工具。本文将详细介绍几个常用的Android自动化测试框架,包括Monkey、MonkeyRunner、UIAutomator、Robotium和Appium。 1. **Monkey** Monkey是...

    Android 阅读器源码

    这个"Android阅读器源码"提供了一个完整的解决方案,允许开发者快速整合到自己的项目中,节省了从零开始构建阅读器功能的时间和精力。下面我们将深入探讨这个源码中的关键知识点。 1. **UI设计**: - **书架界面**...

    hybrid混合开发

    此外,手势交互作为一个新兴的用户界面设计和交互方式,混合应用开发者也需要对其有深入的认识和把握,以便提供更加流畅和直观的操作体验。 在商业模式方面,混合开发为开发者提供了更多元化的商业推广渠道。例如,...

    可以横向拖动的TabHost.rar

    【标题】: "可横向拖动的TabHost" 指的是在Android开发中实现的一种创新的用户界面设计。TabHost是Android SDK提供的一种组件,用于创建带有多个标签(tabs)的应用界面,用户可以通过点击标签在不同的内容之间切换...

    H6 9.0开发文档.zip

    Android 9.0引入了数字健康、手势导航等新特性,开发者可以考虑如何将这些特性融入H6应用,提供更优质的用户体验。 10. **测试与性能监控**: 开发过程中,使用JUnit、 Espresso等自动化测试工具对H6应用进行测试...

    Android开发教程_什么UI界面都有_棒.zip

    Android UI界面开发教程_什么安卓APP界面都有_棒 amr语音编码解码 Fragment View WebView 触摸 手势操作 抽象布局 屏幕解锁 照相机,相册 菜单 代码安全 通信安全 屏幕自适应分辨率 Action Bar HTML的javascript调用...

    动态隐藏和显示工具栏

    4. **Android/iOS原生开发**:在移动应用中,原生SDK提供了相应的API来处理工具栏的动态隐藏和显示。例如,iOS的`UINavigationBar`的`setHidden:`方法,Android的`Toolbar`的`setVisibility()`方法。 5. **Hybrid...

    appium代码.docx

    ` 设置当前上下文,使得可以在这两个环境之间切换,对于处理hybrid app的页面间交互至关重要。 11. `driver.getAppStringMap();` 获取应用程序中的字符串资源映射,这有助于验证本地化和文本一致性。 12. `driver....

    利用mui框架和pdf.js插件实现pdf文件解析与查看

    Mui的核心特性包括响应式布局、触摸优化、离线缓存等,它支持多种平台,如微信小程序、支付宝小程序、Android和iOS的Hybrid App。 接下来是**pdf.js**,这是一个由Mozilla开源的JavaScript库,专门用于在浏览器环境...

    appium秘籍(实际操作,带源码)

    在Appium秘籍中,还会介绍一些进阶技术,如UI Automator的高级应用,这是Android特有的自动化测试技术。同时,对于混合应用框架的开发也有涉及,混合应用是一种将Web应用和原生应用特性结合起来的移动应用类型,这...

    mui webviewGroup.js

    `mui` 是一个轻量级、高性能的前端框架,尤其适用于微信小程序、H5页面以及Hybrid App的开发。该框架提供了丰富的组件库,简化了移动应用开发流程。 在`mui webviewGroup.js`中,主要包含以下几个关键知识点: 1. ...

    jquery和mui js mui css

    接下来,我们转向Mui,它是一个针对移动设备的前端框架,主要服务于Hybrid App和移动Web开发。Mui的特点包括: 1. **组件丰富**:Mui提供了丰富的UI组件,如按钮、列表、下拉菜单、滑动切换等,这些组件都遵循了...

    Appium学习指南

    Appium的学习指南包括安装、配置IDE、启动Appium Server、学习Desired Capabilities(即一组启动Appium测试所需的能力)、元素定位、编写自动化脚本以及手势操作等内容。学习这些内容之前,建议学习者具备一些基础...

    轻量级Web应用框架blademobile.zip

    Hybrid框架第五期目标是实现Hybrid交互适配,由于小钗本身不懂native开发所以此方案要靠后随机期-疑难杂症框架还会单开一个频道做一些疑难杂症处理,比如: ① fixed问题 ② 区域滚动问题 ③ app唤醒 ④ History...

    testing-hybrid-apps-with-appium:演示和使用Appium测试混合移动应用程序的示例

    iOS和Android 测试本地或混合应用 Appium相互作用 轻敲 填写表格(输入文字,选择,单选,复选框) 手势 多点触摸 一个简单的应用程序 使用Ionic来创建一个基本的应用程序。 npm install —g cordova ionic ionic...

Global site tag (gtag.js) - Google Analytics