RN可以满足一般界面的绘制,但是对于一些特定的,还是需要通过原生实现会较为好。比如视频View,弹幕View。他的一般步骤是:
- 定义原生View
- 编写ViewManager
- Js 引入
可以查看文档:Native UI Components
嵌入原生View例子
Java端
- 定义View
比如我们需要使用比较简单的TextView作为例子,首先自定义View
1 | public class MyTextView extends View { |
- 然后,配置js端的RN
1 | public class MyTextViewViewManager extends SimpleViewManager<MyTextView> { |
- 配置ReactPackage,
1 | @Override |
然后设置给ReactNativeHost
即可。
Js端
1 | import {requireNativeComponent, ViewPropTypes} from "react-native" |
这里,我们需要导入prop-types
,用来检测类型,使用ViewPropTypes
表示剩余发View配置,然后就完成了把原生View引入RN中,使用按照正常的Component使用,比如
1 | <MyTextView |
属性解析
我们在Java端定义的时候,有一个注解是ReactProps
,当然,我们可以使用ReactPropGroup
注解。
首先,他是表明要导出的JavaScript属性,通过name指定,然后,被ReactProps
注解的方法,他的第一个参数是该View实例对象,方法可以接受的参数有boolean, int, float, double, String, Boolean, Integer, ReadableArray, ReadableMap
对于使用ReactProps
,他除了name属性之后,还有可选的defaultBoolean
等其他一些default值,假如是自定义类型,比如是Color,可以通过customType指定。
对于使用ReactPropGroup
,他与上面不同是他可以指定一个names数组属性。他的主要作用是给一些属性,比如border,padding,margin等减少方法编写。比如我们设置
在js端,步骤是声明一个变量,name随便起,然后给他添加属性,属性与我们在java被声明的属性name一致,然后必须在最后添加上...ViewPropTypes
。然后通过RN的requireNativeComponent()
方法,抵押给参数是模块名称,第二个参数是我们的声明变量,就可以获得自定义Component了。
事件通讯
在自定义和RN之间,总会有交互,比如View做了某些操作需要对RN页面进行更新等。
未完待续…