在f l u t r中嵌入n a t V E组件的正确姿势是

频道:闲鱼技术 日期: 浏览:381
作者:容忍鱼类技术沃尔玛sio2恩肖

微信号:ccjun91
添加微信群,试用软件
复制微信号

介绍

在从n AT i v e向f u t e r过渡的漫长混合工程期内,为了实现平稳过渡,在n AT i v e f u e r中使用更完善的控制是一个不错的选择。本文介绍了一种新的数字射频器件的应用,以及基于该器件的双端嵌入式数字射频器件的解决方案。

1.1.d e m o r u n

嵌入地图的场景可能存在于许多应用程序中,但当前的地图sdk没有提供f l u t e r库,而且自己开发一套地图显然是不现实的。在这种情况下,使用混合堆栈的形式是更好的选择。我们可以直接在n a t i v e的绘图树中嵌入一个m a p,但该方案中嵌入的v i e w不在f l u t e r的绘图树中。这是一种暴力和不雅的方式,也很难使用。

目前,使用由f l u t e r正式提供的控制是一个优雅的解决方案。下面是一个简单的DEMO嵌入在高德地图中。让我们按照这个应用场景来了解n d r o i d v i w的使用模式和实现原理。

1.2.一种新的用法

n d r o i d v i e w的使用模式与m e t h o d c h a n e l的使用模式类似,后者相对简单,主要分为三个步骤:

步骤1:在d a r t代码的相应位置使用n d r o i d v i w。使用时,您需要输入一个。该序列将用于唯一地识别w ID g e t,并与n a t i v e的v i e w建立关联。

第2步:在n a t v e端添加代码,并编写一个p l a t f o r m v i w f a c t o r y。pla t f o r m v i e w a c t o r y的主要任务是在该方法中创建一个v i e w,并将其传递给fl u t e r(此语句不准确,但我们暂时可以理解,稍后将解释)

步骤3:使用该方法注册刚刚写入的PLATOFORM VIEW OFACTORY。该方法需要传入两个参数。第一个参数需要对应于在fl u t e r端写入的参数,第二个参数是刚刚写入的pla t f o r m v i w f a c t y。

这里省略了配置高德地图的部分。这位官员有更详细的文件,可以在高德开发平台上查阅。

以上是使用n d r o i d v e w的所有操作。总的来说,它似乎相对简单,但在真正使用它时,有两个问题不容忽视:

谁来决定VIEW的最终显示大小?触摸事件是如何处理的?

现在让我们给你一条免费的小鱼来逐一回答。

要解决上述两个问题,我们必须首先理解所谓“传输v i e w”的本质?

2.1.所谓的“传输v i e w”的本质是什么?

为了解决这个问题,阅读源代码并从更深层次上审视整个传输过程是不可避免的。你可以整理出这样的流程图:

我们可以看到,f l u t e r最终得到的是n a t i v e层返回的t e x t u r e i d。根据n a t i v e的知识,k y h该t e x t u r i d是与在n a t i v e侧渲染的v i e w的绘图数据相对应的i d。通过该ID,可以在gpu中找到并直接使用相应的图形数据。那么f l u t e r如何使用这个ID呢?

在之前对f l u t e r接口开发的深入理解中,我们还介绍了f u t e r的绘制过程。我也会给你一个简单的分类

f l u t e r的f r a m w o r k层最终将提交给e n g i n e层的l a y e r e层。LAYE的每个叶节点都将在管道中遍历。每个叶节点最终将调用SKIA引擎来完成接口元素的绘制。遍历完成后,在调用g l p r e n t r n d r b u f r(IO s)或g l s w a p b u f r(a n d r o i d)后,按完成屏幕上的操作。

有很多种类型的打印机,并且一个n d r o i e w使用t e x t u r打印机。在前面的f l u t e r外部纹理中更详细地介绍了t e x t u r e l y e r,这里不再重复。当遍历Te x t u r e l a y e r时,它将调用e n g i n e层的方法,并将Te x t u r e i d作为参数传递。最后,在绘图时,SKIA将根据TEXTUREID直接在gpu中找到相应的绘图数据,并将其绘制在屏幕上。

谁能得到这个我就能做到吗?当然,答案是否定的。TEXTURE数据存储在与创建它的EGLCoNTEXT对应的线程中。因此,如果在其他线程中操作,则无法获得相应的数据。这里需要介绍几个概念:

显示对象(display):提供有关显示像素密度和大小的合理信息。p r e s e n t a t i o n:它为n d r o i d提供了绘制相应上下文(c o n t e x t)和显示对象(d i s p l a y)的能力。它通常用于双屏显示。

我们不需要在这里解释纹理,我们只需要理解,f l u t e r通过纹理实现外部纹理。在创建纹理时,会传入与fl u t e v i w相对应的c o t e x t和一个虚拟显示对象,以便fl u t e r可以直接通过id查找和使用由n a t v e创建的纹理数据。

2.2.谁来决定最终的展示尺寸?

通过上述过程,我们都可以认为,显示大小似乎由两部分决定:一部分是ndroidview的大小,另一部分是ndroid end view的大小。那么谁来决定呢?我们做个实验吧?

直接构建一个新的f l u t e r项目,并将中间部分改为一个n d r o i d v e w。

相应的代码也应添加到a n d r o i d端。为了更好地看到切割效果,这里使用了i m g e v i e w。

首先,看看n d r o i d w。与nD r o i d v i w相对应的r e n d r o b j e c t是r e n d r a n d r o i d v i w,并且有两种确定r e n d r o b j e c t的最终大小的可能性,一种是由父节点指定的,另一种是根据其自身在父节点指定的范围内的情况来确定大小。打开相应的源代码,您可以看到有一个非常重要的属性,即nDROIDVIEW的大小由其父节点决定。我们可以使用诸如c o n t a i n e r、s i z e d b o x等控件来控制n d r o i d v i w的大小。

n d r o i d v i e w的绘图数据由n a t i v e层提供。当在nATIVE中渲染的VIEW的实际像素大小大于nDROIDVEW的实际像素大小时,会发生什么情况?通常,处理这种情况只有两种选择,一种是切割,另一种是缩放。f l u t e r保持其一贯的做法。所有数据都以统一的方式显示。上述情况被视为一种极端情况。

当该VIEW的实际像素大小小于n d r o i d VIEW的实际像素大小时,将发现VIEW不会相应地减小(c o n t a i e r的背景色不会暴露),并且没有内容的地方将填充白色。原因是,在s i ng l e v i e w p r e s n t i o n::o n c r e a t e中,f r a m e l a y u t将用作r o t v i e。

2.3.触摸事件是如何通过的

每个人都应该熟悉n d r o i d的事件流程。它从上到下传输,从下到上处理或回流。f l u t e r也使用此规则,但n d r o i d v i e w通过两个类处理手势:

m o t i o n t s d i s p a t c h r:负责将事件封装到n a t i v e的事件中,并将其传输到n a t i v e;

n d r o i d v i e g e s t u r e c o g n i z e r:负责识别相应的手势,该手势有两个属性:

而且,只有当po i n t v e n t的po i n t e r属性在f o r w a r d p o i n t e r s中时,它才会分布,否则它将存在于c a c h e n t s中。这里的实现主要是解决一些事件的冲突,例如滑动事件,这些事件可以通过g e s t u r e c o g n i z e r s来处理。请参考这里的官方注释。

因此,总的来说,这一部分的过程也很简单:事件的初始阶段从n a t i v e到f l u t e r不在本文的范围内。f l u t e r根据自己的规则处理事件。如果n d r o i d v e w赢得该事件,该事件将被封装到相应n a t i v e端的事件中,并通过方法通道返回给n a t i v e。NIVE将根据自己处理事件的规则进行处理。

3.1.程序限制

达利:这个解决方案是gogole为解决开发商不断增长的业务需求与落后的生态环境之间的矛盾而提出的。这一矛盾是新生态必须面对的主要矛盾。为了解决这个问题,最简单的方法当然是允许开发人员在旧的生态系统中使用非常成熟的控件。当然,这可以暂时解决f l u t e r的生态发展不全面的问题,但使用该方案不可避免地需要编写双端代码(即使现在i o s没有相应的控制,当然以后会更新),无法实现真正的交叉端。

在某种程度上,该方案存在性能缺陷。在a类和r o i d v i e w的第三条评论中,该官员提到这是一个相对昂贵的计划。当也可以通过使用FL u t e r控制来实现时,可以避免使用它。如果你以前读过“f l u t e r external texture”一文,你应该知道,在f u t e r实现外部纹理的方案中,g p u->c p u->g p u的数据处理成本相对较大,在大量使用的场景中会造成明显的性能缺陷。

 

我们通过一些方法绕过了中间CPU的步骤,并在一个p p中实现了这项技术来处理图片资源。

3.2.实际应用

目前,闲置鱼类从n-a-t-i-v到f-u-t-r的迁移遇到了一个问题,即在f-u-t-e端无法访问n-a-t-v-e的本地图片资源。在f u t e r和n a t i v e将长期共存的情况下,当然可以根据f u t e r的规则重新复制资源并将其存储,但这不可避免地会增加软件包的容量,而且不容易管理。

面对这一问题,我们的解决方案是借鉴使用Te x t u r e的n d r o i d v i e的思想,并对其进行优化。实现了n-a-t-i-v-e和f-l-u-t-e-r图像资源的规范化。除了加载位于NATIVE资源目录中的本地图片,您还可以使用NATIVE图片库加载网络图片。

我们这样做的原因是,我们在n a t i v e端的图片库相对完善,并且经过了很多在线测试。在这个阶段,我们不想在重复建造轮子上投入太多精力。事实上,处理在线图片资源的思路与处理本地图片资源的思路相同,因此我们选择统一整合图片资源,并在沟通后与官方团队进行沟通。我们将与你保持一致。请注意我们的官方帐户。

短视频宝宝=慢?阿里巴巴的工程师们就在这样一秒钟内打开了路由管理代码的短视频。阿里巴巴工程师如何高效地解决这个问题?(实用)一个很好的方案,可以帮助您实现复杂数据源中单元格信息的精确规范化。我必须告诉你们的是,关于f l u t e r的初始化过程,闲置鱼没有供应的做法是什么,以及如何做到这一点?游手好闲的鱼没有货源。闲置市场规模超过万亿。二手电子商务迎来了循环经济的红利。“校园圈”真的能成为游鱼生长的第二个引擎吗?

复制成功

微信号: ccjun91
添加微信群,试用软件

我知道了
添加微信

微信号: ccjun91
添加微信群,试用软件

一键复制加过了
18749471747
微信号:ccjun91添加微信
ccjun91