weex Touch手势怎么weex 使用iconfont

51CTO旗下网站
iOS开发教程之手势识别方法
感觉有必要把iOS开发中的手势识别做一个小小的总结。在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的。下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,
作者:清风玉露一相逢来源:cnblogs| 10:42
感觉有必要把iOS开发中的手势识别做一个小小的总结。在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的。下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,也是目标动作回调,话不多说,切入今天的正题。总共有六种手势识别:轻击手势(TapGestureRecognizer),轻扫手势(SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer),
拖动手势(PanGestureRecognizer), 捏合手势(PinchGestureRecognizer),旋转手势(RotationGestureRecognizer);
其实这些手势用touche事件完全可以实现,苹果就是把常用的触摸事件封装成手势,来提供给用户。读者完全可以用TouchesMoved来写拖动手势等
一,用storyboard给控件添加手势识别,当然啦用storyboard得截张图啦
1.用storyboard添加手势识别,和添加一个Button的步骤一样,首先我们得找到相应的手势,把手势识别的控件拖到我们要添加手势的控件中,截图如下
2.给我们拖出的手势添加回调事件,和给Button回调事件没啥区别的,在回调方法中添加要实现的业务逻辑即可,截图如下:
 二,纯代码添加手势识别
用storyboard可以大大简化我们的操作,不过纯代码的方式还是要会的,就像 要Dreamwear编辑网页一样(当然啦,storyboard的拖拽功能要比Dreamwear的拖拽强大的多),用纯代码敲出来的更为灵活,更加便 于维护。不过用storyboard可以减少我们的工作量,这两个要配合着使用才能大大的提高我们的开发效率。个人感觉用storyboard把框架搭起 来(Controller间的关系),一下小的东西还是用纯代码敲出来更好一些。下面就给出如何给我们的控件用纯代码的方式来添加手势识别。
1.轻击手势(TapGestureRecognizer)的添加
初始化代码TapGestureRecongnizer的代码如下:
1&&&&&&2&&&&&UITapGestureRecognizer&*tapGesture&=&[[UITapGestureRecognizer&alloc]&initWithTarget:self&action:@selector(tapGesture:)];&3&&&&&&4&&&&&tapGesture.numberOfTapsRequired&=&1;&&5&&&&&tapGesture.numberOfTouchesRequired&=&1;&&6&&&&&[self.view&addGestureRecognizer:tapGesture];&
在回调方法中添加相应的业务逻辑:
1&&2&-(void)tapGesture:(id)sender&3&{&4&&&&&&5&}&
2.长按手势(LongPressGestureRecognizer)
初始化代码:
&2&&&&&UILongPressGestureRecognizer&*longPressGesture&=&[[UILongPressGestureRecognizer&alloc]&initWithTarget:self&action:@selector(longPressGesture:)];&3&&&&&&4&&&&&longPressGesture.minimumPressDuration&=&0.5;&&5&&&&&[self.view&addGestureRecognizer:longPressGesture];&
在对应的回调方法中添加相应的方法(当手势开始时执行):
1&&2&-(void)longPressGesture:(id)sender&3&{&4&&&&&UILongPressGestureRecognizer&*longPress&=&&5&&&&&if&(longPress.state&==&UIGestureRecognizerStateBegan)&6&&&&&{&7&&&&&&&&&UIAlertView&*alter&=&[[UIAlertView&alloc]&initWithTitle:@&提示&&message:@&长按触发&&delegate:nil&cancelButtonTitle:@&取消&&otherButtonTitles:&nil];&8&&&&&&&&&[alter&show];&9&&&&&}&0&}&
代码说明:手势的常用状态如下
开始:UIGestureRecognizerStateBegan
改变:UIGestureRecognizerStateChanged
结束:UIGestureRecognizerStateEnded
取消:UIGestureRecognizerStateCancelled
失败:UIGestureRecognizerStateFailed
3.轻扫手势(SwipeGestureRecognizer)
在初始化轻扫手势的时候得指定轻扫的方向,上下左右。 如果要要添加多个轻扫方向,就得添加多个轻扫手势,不过回调的是同一个方法。
添加轻扫手势,一个向左一个向右,代码如下:
1&&&&&&&2&&&&&UISwipeGestureRecognizer&*swipeGesture&=&[[UISwipeGestureRecognizer&alloc]&initWithTarget:self&action:@selector(swipeGesture:)];&&3&&&&&&&4&&&&&swipeGesture.direction&=&UISwipeGestureRecognizerDirectionR&&&5&&&&&[self.view&addGestureRecognizer:swipeGesture];&&6&&&&&&&7&&&&&&&8&&&&&UISwipeGestureRecognizer&*swipeGestureLeft&=&[[UISwipeGestureRecognizer&alloc]&initWithTarget:self&action:@selector(swipeGesture:)];&&9&&&&&&10&&&&&swipeGestureLeft.direction&=&UISwipeGestureRecognizerDirectionL&&11&&&&&[self.view&addGestureRecognizer:swipeGestureLeft];&
回调方法如下:
1&&&2&-(void)swipeGesture:(id)sender&&3&{&&4&&&&&UISwipeGestureRecognizer&*swipe&=&&&5&&&&&if&(swipe.direction&==&UISwipeGestureRecognizerDirectionLeft)&&6&&&&&{&&7&&&&&&&&&&&8&&&&&}&&9&&&&&if&(swipe.direction&==&UISwipeGestureRecognizerDirectionRight)&10&&&&&{&11&&&&&&&&&&12&&&&&}&13&}&14&&&&&&
4.捏合手势(PinchGestureRecognizer)
捏合手势初始化
&&&2&&&&&UIPinchGestureRecognizer&*pinchGesture&=&[[UIPinchGestureRecognizer&alloc]&initWithTarget:self&action:@selector(pinchGesture:)];&3&&&&&[self.view&addGestureRecognizer:pinchGesture];&
捏合手势要触发的方法(放大或者缩小图片):
&1&&&2&-(void)&pinchGesture:(id)sender&&3&{&&4&&&&&&UIPinchGestureRecognizer&*gesture&=&&&5&&&&&&&6&&&&&&&7&&&&&if&(gesture.state&==&UIGestureRecognizerStateChanged)&&8&&&&&{&&9&&&&&&&&&&10&&&&&&&&&_imageView.transform&=&CGAffineTransformMakeScale(gesture.scale,&gesture.scale);&11&&&&&}&12&&&&&&13&&&&&&14&&&&&if(gesture.state==UIGestureRecognizerStateEnded)&15&&&&&{&16&&&&&&&&&[UIView&animateWithDuration:0.5&animations:^{&17&&&&&&&&&&&&&_imageView.transform&=&CGAffineTransformI&18&&&&&&&&&}];&19&&&&&}&20&}&
5.拖动手势(PanGestureRecognizer)
拖动手势的初始化
&2&&&&&UIPanGestureRecognizer&*panGesture&=&[[UIPanGestureRecognizer&alloc]&initWithTarget:self&action:@selector(panGesture:)];&3&&&&&[self.view&addGestureRecognizer:panGesture];&
拖动手势要做的方法(通过translationInView获取移动的点,和TouchesMoved方法类似)
1&&2&-(void)&panGesture:(id)sender&3&{&4&&&&&UIPanGestureRecognizer&*panGesture&=&&5&&&&&&6&&&&&CGPoint&movePoint&=&[panGesture&translationInView:self.view];&7&&&&&&8&&&&&&9&}&
6.旋转手势(RotationGestureRecognizer)
旋转手势的初始化
&&2&&&&&UIRotationGestureRecognizer&*rotationGesture&=&[[UIRotationGestureRecognizer&alloc]&initWithTarget:self&action:@selector(rotationGesture:)];&3&&&&&[self.view&addGestureRecognizer:rotationGesture];&
旋转手势调用的方法:
复制代码&&&1&&&2&-(void)rotationGesture:(id)sender&&3&{&&4&&&&&&&5&&&&&UIRotationGestureRecognizer&*gesture&=&&&6&&&&&&&7&&&&&if&(gesture.state==UIGestureRecognizerStateChanged)&&8&&&&&{&&9&&&&&&&&&_imageView.transform=CGAffineTransformMakeRotation(gesture.rotation);&10&&&&&}&11&&&&&&12&&&&&if(gesture.state==UIGestureRecognizerStateEnded)&13&&&&&{&14&&&&&&&&&&15&&&&&&&&&[UIView&animateWithDuration:1&animations:^{&16&&&&&&&&&&&&&_imageView.transform=CGAffineTransformI&17&&&&&&&&&}];&18&&&&&}&19&&&&&&20&}&
本文链接:http://www.cnblogs.com/ludashi/p/3983008.html【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点关注热点
24H热文一周话题本月最赞
讲师:96381人学习过
讲师:268708人学习过
讲师:228054人学习过
精选博文论坛热帖下载排行
本书分为8章,首先介绍ASP.NET的开发技巧和重点技术,尤其针对初学者如何快速入门并掌握ASP.NET编程做了深入浅出的介绍;然后重点介绍ASP.N...
订阅51CTO邮刊没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!手势识别算法新突破 uSens凌感发布新版Fingo SDK
硅谷三维人机交互公司uSens凌感近日发布新版Fingo SDK,在手势算法底层进行了突破性改进,新增一系列双手交互动作,如握拳、手心写字、十指交叉等,在同类产品中,率先实现对大面积遮挡的双手交叠类手部动作的识别,并可实现对十个手指的灵活细微运动的追踪,技术全球领先,有效解决了在应用中手势操作的痛点问题。
uSens凌感在2017年2月正式公开发售其手部追踪解决方案 -- Fingo。Fingo集成软硬件为一体,硬件上通过两个红外摄像头及三个红外辅助灯追踪手部动作,软件上基于计算机视觉及深度学习等算法,实现对双手骨骼的识别,大部分常用手势均可实现精准低延迟识别。经过半年的不断优化改进,本次发布的新版SDK在手势的整体稳定性、精确度以及多样化方面大幅提升,对常用手势动作进行了深度优化。
人的手部动作灵活复杂,不仅有直接可见的清晰手型,也有握拳、手指交叉、左右手交叠等等对关节点有大幅遮挡的动作,这些遮挡的部分如何精准识别成为判断手部追踪技术的一个关键指标。uSens凌感联合创始人、CTO费越博士介绍:&我们的手部追踪指的是实现双手的自然交互,不是识别几种固定的手势,也不是跟踪五个指尖,而是通过对手部26个自由度的追踪,通过深度学习等算法,对手部骨骼进行识别。人是主动性的,不是被动的受限交互,这就不可避免的出现大家生活中常用的双手交互的动作,比如鼓掌、握手、双手交叉换位等。为了给用户创造自然沉浸的三维交互体验,我们认为这部分虽然难度高,但有必要突破,其他方案目前还没有涉及这部分,或者效果不佳。我们先行启动了在这个方向的研发和尝试。&
uSens凌感新版手势更新新增双手交互动作
uSens凌感高级技术总监毛文涛主导手势开发,他表示:&这次版本迭代,我们以实用、可用、好用为目标。我们发现在行业实际应用中,手势操作有些痛点问题一直没得到很好地解决,如:聋哑人沟通用的手语中有大量双手交叉或交叠在一起的动作,这类动作目前市面上产品无法做到或表现不佳。VR社交、VR课程中,希望有一些类似小键盘的操作,学生或用户长时间手势悬空操作会比较辛苦。针对这些问题,我们做了一些尝试,在算法层进行了改进,比如实现了在手心上写字、左右手交叉等一系列双手触碰的动作,这样可以提供另一只手的支撑,无需悬空操作,用户体验大幅提升。&
uSens凌感的手部追踪解决方案Fingo自今年年初推出后,已经与国内外AR VR类头显厂商进行了深度合作,部分厂商已在规划集成Fingo的交互头显,预计今年底或明年初将有产品面世。基于Fingo的注册开发者不断增加,行业覆盖游戏、房地产、教育、汽车、展览展示等。uSens凌感立足中国市场,目前已在北京、深圳、杭州设立运营、研发以及售后支持团队,重点支持中国客户及本地开发者。
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
近年来,随着科学技术的不断发展、生活水平的不断提高,人们对身心健康越来越重视。在电子科技领域出现了很...
之前4.x系列框架主要侧重于在OpenGL ES和Vulkan之间提供统一的接口,充当跨平台、跨AP...
像许多其他汽车制造商一样,宝马也热衷于在CES上展出其最新的科技。今年也一样,公司计划下周在拉斯维加...
NVIDIA宣布扩展其Isaac平台以构建机器人应用,此举将加速机器人在各行各业中的开发与部署。
在某一时刻,我们现在知道的Windows计算机是由MS-DOS操作系统组成的,Windows是一个在...
两家公司的合作可在一系列便携多媒体设备中实现免接触(Touch Free)用户交互接口解决方案,包括...
在全球范围内,“老牌”的Leap Motion和“新生”的Untouch(未动科技)、uSens(凌...
 近日,Rethink Robotics发布了Sawyer软件开发工具包(SDK)。该款升级版软件专...
据麦姆斯咨询报道,美国专利商标局于11月28日正式公布了一系列来自 苹果 公司的69项新授权专利。下...
全称Java 2 Enterprise Edition,是Java的一种企业版,用...
紫光旗下展讯通信(以下简称展讯),作为中国领先的2G、3G和4G无线通信终端的核心芯片供应商之一,在...
当前科技领域百舸争流,千帆竞发,一日千里。作为集成电路设计的弄潮儿,汇春科技本着注重信誉、精益求精的...
作为计算机视觉领域的全球领导者,eyeSight已在全球获得18项专利授权 不断引领创新,推动计算机...
今日报道uSens凌感与Pico联手展开了关于将手势交互功能与Pico小怪兽一体机整合的深度合作。曾...
自人类发明了工具以来,与工具之间就需要通过一种方式建立起联系,用手握住工具的把手就是联系的一种。进入...
科技快速发展至今,越来越多的智能产品走到我们的身边,在某一天我们可以抛开传统的机械开关和按键,只需要...
如果使用ZC702单板内置的digilent电缆,SDK 14.6 和 ChipScope 14.6...
要调试基于Xilinx SDK的Linux内核模块,必须使能 KERNEL_DEBUG_INFO和K...
本教程介绍了如何使用μC/ OS BSP建立在ZYNQ基本应用程序(R)使用Vivado -7000 (TM)...
本文参考 Xilinx SDK软件内置的教程,打开方法:打开SDK->Help->Cheet She...
赛灵思 Zynq(R)-7000 All Programmable SoC 系列代表了嵌入式设计的新局面...
皓丽会议平板支持远程会议功能,可连接高保真全向式麦克风,USB无线摄像头等视频会议设备,兼容Poly...
灵云机顶盒远场语音助手采用线性4麦克风布局的阵列形式,通过语音唤醒,回声消除(消除电视播放的声音),...
电子发烧友早八点讯:当下虽然无人机品牌众多,但大体都采用遥控器+机体的配置模式,操作起来需要一定的熟...
想象一下这个场景,你正在车库干活,突然闻到了厨房中新鲜出炉的饼干的香味儿。你迫不及待地想尝一尝,你冲...
本文介绍zynq中使用FreeRTOS的空闲钩子函数时在SDK中的设置和一些说明
九年前,苹果发布了iOS SDK,也就是我们经常说的开发工具包,iOS SDK的发布让第三方开发者可...
opencv实现算法如下:把图片先进行处理,处理过程:1.用膨胀图像与腐蚀图像相减的方法获得轮廓。2...
.PPR文件是PLANAHEAD的工程文件,在WINDOWS下面可以直接双击打开,PROJECT.c...
按正常情况来说苹果每两年才会进行一次大的iPhone产品变化,比如iPhone 6之后是6s,这基本...
据华尔街券商柯文公司(Cowen and Company)周三提供给客户的一份研究报告称,苹果的下一...
新一代大众(VW)Golf 7(Facelift)提供接近和手势控制的信息娱乐系统“Discover...
微软还在想象真实的生活场景物体将被用于虚拟世界操作,比如看到办公室的篮球就可以激活体育广播,向左或者...
虚拟现实设备体验的提升除了与处理器、显示技术等息息相关,与虚拟现实设备的交互也十分重要。无论在VR还...
手势识别对于我们来说并不陌生,手势识别技术很早就有,目前也在逐渐成熟,现在大部分消费类应用都在试图增...
11月8日消息,AR领域的创业公司亮风台推出第二代AR移动眼镜。去年11月,亮风台推出了首款双目AR...
最近,苹果通过了两个关于设备交互操作方式的新专利,可以让用于通过3D手势和空间与Mac或iOS设备进...
眼球追踪、手势以及距离传感器技术可导入应用的范围很广,例如在医疗领域,眼球追踪传感器有助检测脑震荡或...
自从在美国的CES上发布一辆一体式互联(Holistic Connectivity)演示车之后,大陆...
锋时互动科技联合创始人张硕表示,现在常见的人机交互是语音识别,其实还有手势识别这个技术,它归类于一个...
2016 年 3 月 28 日 ─ Imagination Technologies 发布最新版的 ...
近日,微软在可穿戴设备上的一项专利遭到曝光,从专利上来看,微软的这个产品将不同于以往的手环设备,而是...
Andreas Guete表示,Microchip开发的GestIC(R)技术只有一个目标:给3D手势识...
由网易科技主办的“网易创业Club周年庆典”在北京举行。在大会现场,海尔赛富执行董事蒋驰华、乐相科技...
在广阔的市场前景和鼓励性的政策支撑下,车联网行业风起云涌,各大互联网巨头纷纷抢滩登陆。“手机车联网”...
指纹识别、压力触控、眼球识别、眼球滚动、边缘触控、声控拍照、悬浮预览、手势翻页等各类新技术、新名词层...
这一极具科技感和现代感的技术已经进入各大汽车厂商和一些科技巨头的眼中,他们纷纷表示,HUD未来将成为...
在 IT 史上,以点带面引领潮流的事情不在少数,mac 开启了个人 PC 时代,网景开启了互联网时代...
全息技术在科幻电影中很常见,不论是《星球大战》、《钢铁侠》还是《阿凡达》,其中都不乏全息投影的概念,...
全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Techn...
当地时间周二,美国专利和商标局授予苹果一项新专利。在这项专业技术下,用户可以通过“访问输入”来决定打...
目前,华盛顿大学研究员成功做出一个使用Wi-Fi信号就能检测手势识别的系统原型WiSee,该系统可以...
日前,德国艾尔默斯半导体ELMOS公司推出一款用于手势识别的非接触式光电传感器E527.16。该芯片...
英特尔正在计划收购以色列手势识别和跟踪技术公司Omek Interactive。 竞争对手高通和三星...
2月20日消息,黑莓公司最近申请了一项专利,可以在不触摸手机屏幕的情况下,通过在屏幕上方移动手指来选...
在2013年消费电子展(CES)上,全球整合式芯片解决方案的领导厂商美满电子科技(Marvell,N...
硅产品知识产权(SIP)平臺解决方案和数位信号处理器(DSP)内核授权厂商CEVA公司,宣佈作为CE...
本文为你图文解释Windows 8 PC触控手势和对应的鼠标操控功能。
全球领先的硅产品知识产权(SIP)平台解决方案和数字信号处理器(DSP)内核授权厂商CEVA公司和免...
意法半导体(ST)推出一款拥有客制化动作识别功能的微型六轴感测器模组。意法半导体最新的iNEMO惯性...
  本文讨论如何唤醒平板电脑等触控装置,无需接触设备,而是采用基本的手势识别及新颖的接近检测传感器。...
本文讨论如何唤醒平板电脑等触控装置,无需接触设备,而是采用基本的手势识别及新颖的接近检测传感器。本文...
欧姆龙开发出了可从摄像机拍摄的人上半身的视频等来识别此人手势的“手势识别技术”。结合使用了面部识别技...
欧姆龙宣布开发出了可识别手部动作的“手势识别技术”,可同时识别手部或手指的位置、形状及动作。据介绍,...
利用 AD7879 控制器和极少的辅助电路,可以检测缩放、捏 合和旋转。只需在有源层上进行测量,就能...
Si1000系列无线单片机在一个芯片中集成了Si44xx系列RF芯片和单片机。新华龙电子还展示了一款...
来自麻省理工学院技术媒体实验室的研究人员用带有嵌入式光学传感器的显示器作为无镜头的相机以识别屏幕前的...
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-改变不活跃,开源社区weex经历了这些技术挑战!
改变不活跃,开源社区weex经历了这些技术挑战!
本文主要介绍过去一年里Weex业务规模不断扩大,业务复杂度不断上升,给Weex带来了哪些技术挑战,以及Weex在技术架构和设计上做了哪些升级来应对这些挑战
2017年,Weex的业务规模呈现了爆发式的增长,不但在比较擅长的会场业务弥补了最后1%的页面,也就是一些富交互、富视觉的页面,让店铺承接页也全部Weex化,同时更重要的是支持了很多常态化的业务和产品。
业务规模的不断扩大,业务复杂度的不断上升,给Weex的技术到底带来了什么样的挑战?交互体验问题,我们在2016年做的更多的还是纯展示的活动页面,而2017年要支持的这些常态化的业务和产品,很多原来就是native的,对于动画、手势等交互体验要求比较高,一些native非常常见的交互效果,在Weex上实现起来挑战非常大。内存压力,越来越多的业务Weex化之后,用户整个点击路径都变成了Weex,举个例子,2017年的双11预售期,当我们打开手淘,点击狂欢城H5,再点店铺承接页Weex,点主会场Weex,点分会场还是Weex,然后分会场、分会场不断地逛,链路中每个页面都非常复杂,其中大部分页面是很长的列表页,包含了大量的楼层、视频、动效等复杂组件,整体内存占用非常高,这就导致整个APP的crash率上升非常明显。2017年我们升级了列表渲染架构,针对内存问题重点优化了一次。性能稳定性,如何把V8引擎升级到JSC来提升JS执行性能,如何能让JSC在独立进程运行而不影响主进程稳定性,如何解决JS上下文全局污染问题,如何替换Yoga以解决License问题而又不影响布局性能等等WeexCore,如何在架构上实现跨平台和高性能,将一些通用的逻辑下沉到C++。
纵观Weex一开始诞生到现在,它的技术演进过程可以总结为从具象到抽象不断探索的过程。特殊组件期:最开始Weex亮相的时候是2015年双11,当时只支持了一个会场页面。那时候我们做了非常多的特殊组件,比如tabbar组件,倒计时就做一个countdown组件,跑马灯就做一个marquee组件。当时的Weex可以理解为是一个非常具象的框架,由一大堆特殊组件拼接而成,最后达到了动态化的目的。偏展示期:到了2016年双11,我们要支持整个双11所有会场,几千张页面,继续使用2015年的方式肯定是不行的。于是我们做了很多偏展示的基础样式,比如支持text的基础样式,div的基础样式,最基本的动画模块,存储等一些基础且细粒度的模块等,以及一个相对来说比较高性能的列表组件。富交互期:到了2017年中,我们要支持一些固定的产品,一些核心业务,偏展示又满足不了需求了,于是我们重点去打富交互,支持富文本、手势、布局动画以及一些通用的交互组件。国际化:到了11、12月时又来了一波挑战,我们要支持Lazada等国际化的APP,于是整体做了一次国际化,比如从右到左的文字排布,比如无障碍、多语言、多端差异化等。标准化:到了2018年,我们要做的是标准化,尽可能抹平跨端在组件和架构上的不一致性,遵循标准并推进标准,让Weex变得更加通用。
交互体验升级
什么是好的交互体验?
我们做交互体验首先要问的一个问题,到底什么是好的交互体验? 2017年之前,我们会关注几个特性,第一,加载速度很快,希望用户从点击页面到最后整个首屏渲染完,在一秒内完成,也就是我们经常说的秒开。第二是滚动流畅,用指标描述就是60FPS。到了2017年要求就更高了,当时交互同学给了我们一些例子,看一下在他们眼中好的交互体验是什么样的。
第一个例子,iOS原生的mail app,随着左右滑动的手势,两边的view可以灵活地做动画,这个在业务上非常常见。比如左滑删除,右滑关注之类的功能。
第二个例子,有好货,它是由多个tab组成,每个tab都是很长的列表。下面可以通过手势操作列表,同时tab可以灵活的进行切换。
最后还有一个微博的例子,也就是我们经常所说的滚动视差体验,随着列表下拉,图片变大或者变模糊,随着列表向上滚动,图片以不同速率移动。一句话概括这些例子对Weex交互体验的要求,那就是随着用户的操作,Weex页面需要持续又快速的进行响应。
需要遵循哪些原则?最大化利用native:我们做交互演进过程中,一直在思考Weex最大的价值是什么。我们认为,Weex 最大的优势和价值在于其native 的能力,我们要最大化利用native 的特性,而不是去模仿它。怎么去理解?举个例子,Native 的列表组件,有着非常好的滚动流畅度、内存控制能力、View复用能力,我们希望把它的所有能力都能透出给前端JS,而不是想着在 JS 侧重新再模仿一个长列表组件。从下至上:首先竭力解决最底层的东西,比如通信的消耗、手势、基本的动画、文字的基本样式。如果这些问题解决起来成本太高,我们会暂时先往上,封装一些通用的组件、模块级的解决方案,来解决大部分应用场景。再往上就是封装业务组件,把native 的一些复杂的能力整块整块地丢给JS。允许多端差异化:允许Android遵循MD的设计规范,iOS遵循iOS的一些设计规范,一些复杂的交互和视觉,运行Web进行体验上的降级
如何解决通信时延的问题?
在交互体验升级过程中,最大的挑战是JS和native的通信时延问题,举刚才滚动视差的例子,随着滚动,每一帧native发起滚动事件,JS监听做一些处理,计算出要发生多少translate位移,重新告诉native,native再做动画,整个循环需要在一帧也就是16毫秒内完成。现实情况下非常难做到,大部分情况下这个流程下来至少都是50毫秒。当时我们用这种方式也做了一个Demo,滚动视差的效果,大家会发现抖动非常明显,和持续快速响应的目标相去甚远。
优化思路也很简单,两个优化思路,第一是减少通信次数,希望一次通信把这些事情都搞定。这里我们用了Expression Binding模块和parallax组件,他们的原理类似,就是将手势事件和View属性变更的关系提前绑定到native, 当手势事件发生时,native根据这个关系来选择输出,不再需要发事件给JS及接受JS的指令。
第二种思路是优化单次通信耗时。我们发现通信大部分时间都花在序列化和反
序列化过程中。我们自己发明了一个通信协议wson,用的是二进制传输协议,序列化和反序列化效率提升很多。同时因为通信时间的提升,整个页面加载时间也有了一定的提升,大概在5%左右。
列表渲染架构升级
列表组件的前世今生
我们再来看一下另外一个重要的技术演进:列表渲染架构的升级,2015年双11第一次亮相,我们用的组件是Scroller,完成了从DOM树到View树的转换,缺点是必须等JS解析完所有节点才会到native,一次会创建非常多的View,对一个长列表来说了经常需要3-5秒才能出来;到了2016年年中时我们加了一个渐进式渲染的概念,node和tree模式的灵活搭配,最小粒度渲染,解析完单个DOM后可立即显示。但这个方案仍然也一些瓶颈,它渲染了不可见区域,内存占用比较高。到了2016年的双11,我们使用了List,相对于Scroller好多了,我们透传了native 的UITableView 和RecycleView, 在内存的控制上提升明显,比如只渲染可见区域,View内存回收复用等。
到了今年,list也开始满足不了需求了,刚才说了,整个链路都是Weex 长列表,内存挑战很大。而我们的list在内存占用上和native列表还是有不小的差距,另外list还有一个比较大瓶颈就是无法做view的复用,低端机滚动帧率较差。
列表渲染架构解析
我们看一下老的native设计是什么样的,这是偏底层的设计和架构解析。假设一个业务有M个模板和N条数据,我们现在做的就是在JS层做一个模板解析和数据绑定的工作,这一层是Vue做的。JSFM会生成N个Virtual DOM,Native生成N个native Component,可视区域内有限个native View。
这样一个架构问题在哪里呢?为什么做不到View结构的复用? 简单来说,要做复用必须在native 进行模板数据绑定,现在在JS层已经绑定好了,native拆不开,没法做复用。为什么内存占用高?因为element 和component 是重复生成的,虽然他们只是一个个对象,但当列表非常长,无限滚动时,它的内存仍然会呈上升的趋势。为什么帧率差?View永远都是销毁掉重新创建,主线耗时变高,虽然中间也做了一些异步渲染的处理,但还是没有达到理想的幀率.
什么是真正的复用,其实就是类似于垃圾分类的过程,数据就是垃圾,不同种类的垃圾,可回收垃圾、有害垃圾、厨房垃圾,Cell模板就是垃圾桶,我们只要把数据分门别类,在native 侧放到不同垃圾桶里就可以了。回到刚才那张架构设计图,我们需要做的,也就是把数据绑定放到native。看上去整个设计变化非常小,但我们做了差不多三个月,也找了尤雨溪配合我们在Vue 上进行改造。
最后是性能对比。前段时间我们刚好研究了下RN 的几个列表组件,顺便做了一个性能对比,recycle-list是我们新做的列表组件。对比的案例是左边这张图,有60屏数据,在淘宝页面里不算特别长,里面有3000+节点。看一下右边的性能数据报告,总的来说,最大优势就是内存,在iOS,可以让这样一个长列表页面的内存占用控制在个位MB,同时因为通信的数据量变少了,在加载时间、CPU消耗上也有一定的提升。
(本文作者隐风 阿里巴巴技术专家)}

我要回帖

更多关于 weex ui使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信