第一集我们谈谈 PlatformView 里的表情符号该事件传达,为甚么会有这么一则?
只不过在此之后早已写过很多 Flutter 里有关混和合作开发里 PlatformView 的内容,而随着 Flutter 版的插值, PlatformView 的同时实现也再次出现了一定的发展史本钱难题,正好最近和元老探讨了混和采用 VirtualDisplay 和 HybirdComposition 时表情符号该事件有甚么区别,就别忘了把探讨结果剖析出来。
对发展史本钱难题钟爱的能看 《混和合作开发的浸淫》,之前写过 PlatformView 的文章最早的早已两年多前,有关该事件处置历经过太多版,如今可能会造成了一些误会或者布季,就在第一集纸制解释。首先在现阶段 3.3 的版里,Flutter PlatformView 主要有 VirtualDisplay 、 HybirdComposition 和 TextureLayer 三种同时实现,而这四种同时实现在表情符号该事件传达同时实现有差别,但业务流程完全一致,因此第一集的目的是加速剖析它的分野。
假如从现阶段的同时实现方法论上总结,他们在业务流程上基本是完全一致的,该事件都是从原生植物 -> Dart -> 原生植物这种的一个积极响应处置过程 ,也是如下图右图,由原生植物的 onTouchEvent 造成表情符号该事件,接着经过 dart 的标准化的该事件Arena处置后,最终回到原生植物层再去促发原生植物命令行积极响应该事件。
也是在现阶段的设计里,无论是何种 PlatformView 的同时实现,原生植物命令行都不能马上积极响应轻触该事件,而是标准化发送至 dart 展开处置,之后再返回促发 Native 命令行展开积极响应,这种处置的优劣在于:
益处是处置方法论能在 dart 里标准化,并且针对原生植物命令行的该事件处置也能在 dart 层展开截击处置再者是原生植物 Event 历经了多次转换,中间可能再次出现精确度遗失和积极反应速度的难题,的的需要大量拖曳的情景因此在 PlatformView 的 dart 同时实现里会有 gestureRecognizers 模块用作合作开发人员处置自订该事件积极响应的支持,例如配置 EagerGestureRecognizer 能用作获得所有表情符号,解决表情符号武装冲突难题。那么它在同时实现上有甚么差别?只不过这些差别不能直接影响你的采用,假如不屑一顾能不关心,但对于认知整个表情符号该事件传达来说又是必不可少。
VirtualDisplay
VirtualDisplay可以说是老当益壮了,Joss华岩最终在 3.3 版系还继续入役,我们都知道 VirtualDisplay 的同时实现是采用 Android 上副屏的图形方法论,接着把命令行图形到缓存,通过着色 id 抽取制备镜头,也是:
虽然你看到命令行在那里,但只不过它并不是真的在那里,你看的是只是制备之后的着色,因此 VirtualDisplay 上原生植物端接受到的轻触该事件,只不过是来自于 FluterView 。在 VirtualDisplay 里轻触该事件的发起和普通 Flutter 命令行一样,都是从 FlutterView 的 onTouchEvent 开始,经过标准化的该事件Arena处置后,最终回到 java 层去促发 NativeView 积极响应表情符号信息。
因此在 VirtualDisplay 里所有的 Event 都是直接来自 FlutterView ,走的是 AndroidTouchProcessor 展开发送。
HybirdComposition
对于 HybirdComposition 来说这个同时实现又不大一样,因为 HybirdComposition 是直接把原生植物 View 通过 addView 添加到 FlutterView 上面,中间通过 FlutterMutatorView 作为容器,大概效果如下图右图。
那是不是 HybirdComposition 上用户的轻触点击该事件是直接由原生植物命令行展开积极响应呢?答案是否定的。
只不过一开始HybirdComposition 的设定确实是这种,但后来为了标准化和方便处置, FlutterMutatorView 上添加了 onInterceptTouchEvent 展开了截击,因此该事件都无法传达到它的子命令行上,而是在 FlutterMutatorView 通过 AndroidTouchProcessor 发送至 Dart 层。
当然,事实上在坐标处置上也有差别,因为这里的 onTouchEvent 是 FlutterMutatorView 上的轻触该事件坐标,而为了能够匹配到 dart 里的坐标展开积极响应,还需要通过矩阵转化为屏幕坐标,而这部分换算在 VirtualDisplay里是不需要的。
事实上 HybirdComposition 的同时实现在轻触该事件积极响应上比较有迷惑性,特别是某些情景下会很有趣,例如在下面这个情景上:
红色的是 Flutter 命令行,蓝色是 Native 命令行,它正好有一部分重叠在一起。我们知道在 HybirdComposition 里,假如 Flutter 命令行需要覆盖在 Native 命令行之上是,就会需要一个 FlutterImageView 来做新的图层承载,但 FlutterImageView 本身并没有做轻触该事件处置,因此假如这时候点击红色 RE ,就会有两种情况:
点击的是和蓝色 Native 命令行相交的区域,因为该事件穿透的影响,此时会是通过 FlutterMutatorView 促发该事件发送至 Dart点击的是没有相交的区域时,因为该事件穿透的影响,此时会是通过 FlutterView 促发该事件发送至 Dart虽然这个过程其实很诡异,但实际上并不能影响最终结果,详细钟爱能看《Flutter 3.0下的混和合作开发演进》TextureLayer
只不过 TextureLayer 的该事件同时实现和 HybirdComposition 类似,不同之处在于它是通过 PlatformViewWrapper 做父容器来截击该事件。
PlatformViewWrapper 同样通过 onInterceptTouchEvent 展开了该事件截击,因此该事件都无法传达到它的子命令行上,而是通过 AndroidTouchProcessor 发送至 Dart 层,同时在对应的 onTouchEvent 上需要做该事件转化。
PS ,这里看到 TextView 是空白的原因是 PlatformViewWrapper 通过 Hook 了 Canvas 从而抽取 Child 着色的过程,详细钟爱可见:《Flutter 3.0下的混和合作开发演进》。因此本质上 TextureLayer 和 HybirdComposition 在该事件消费处置上类似,只是不能有像 HybirdComposition 一样会有 FlutterImageView 那样诡异的传达方式而已。
最终
好了,第一集的内容只不过并不复杂,主要是帮助你理清 PlatformView 里表情符号该事件传达和处置的相关方法论,理清这部分方法论,在你采用 add-to-app 时针对一些表情符号武装冲突会更有帮助,如果还有甚么想说的,欢迎留言探讨~