在之前的一篇文章中,我记录了已有的Android项目如何接入React Native,介绍了RN如何调用原生的方法,本篇文章上在之前的一篇的文章的基础上续写的,这一篇文章中我将记录Android如何封装原生组件,然后RN来使用它。如果对接入RN还不太了解的,可以看看我的另一篇文章 Android原生项目接入React Native

其实,如果Android接入RN已经搞好了,这个就不难弄了,都是类似的,下面先大致介绍一下如何使用原生UI组件的,图解如下:

从图中可以很清楚地看到实现步骤,具体如何实现,下面一步一步来介绍:

  • Step1 继承SimpleViewManager 代码如下:
public class NativePaintViewManager extends SimpleViewManager<MyPaintView> {    public static final String REACT_CLASS = "RCTMyPaintView";    @Override    public String getName() {        return REACT_CLASS;    }    @Override    protected MyPaintView createViewInstance(ThemedReactContext reactContext) {        return new MyPaintView(reactContext);    }    @ReactProp(name = "color")    public void setColor(MyPaintView paintView, String color) {        paintView.setColor(color);    }    @ReactProp(name = "raduis")    public void setRaduis(MyPaintView paintView, Integer raduis) {        paintView.setRaduis(raduis);    }}

说明一下,这里的SimpleViewManager指定的类型为MyPaintView,这个MyPaintView就是Android自定义的一个View,我简单的画了一个圆,提供的属性有 color,raduis 分别表示圆的颜色以及半径大小,注意需要用@ReactProp注解。接下来介绍一下MyPaintView

  • step2 自定义MyPaintView的实现
public class MyPaintView extends View {    /**     * 画笔     */    private Paint mPaint;    /**     * 圆的半径     */    private float raduis=100;    /**     * view的宽和高     */    private int width;    private int height;    public MyPaintView(Context context) {        this(context, null);    }    public MyPaintView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public MyPaintView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        mPaint = new Paint();        mPaint.setColor(Color.BLUE);        mPaint.setStrokeWidth(50);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        width = w;        height = h;    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.translate(width / 2, height / 2);        canvas.drawCircle(0, 0, raduis, mPaint);    }    /**     * 设置颜色     */    public void setColor(String color) {        mPaint.setColor(Color.parseColor(color));        invalidate();    }    /**     * 设置圆的 半径     */    public void setRaduis(Integer raduis) {        this.raduis = raduis;        invalidate();    }}

这里 我就简单的画了一个圆,对外提供了设置颜色跟设置半径两个方法,当RN引用这个组件的时候,就可以将这两个方法转化成对应的属性了,在js中使用就很简单了

  • step3 把这个视图管理类注册到应用程序包的createViewManagers里 在MyReactPackage中修改
public class MyReactPackage implements ReactPackage {    @Override    public List createNativeModules(ReactApplicationContext reactContext) {        List modules = new ArrayList<>();        //将我们创建的类添加进原生模块列表中        modules.add(new MyNativeModule(reactContext));        return modules;    }    @Override    public List> createJSModules() {        //返回值需要修改        return Collections.emptyList();    }    @Override    public List createViewManagers(ReactApplicationContext reactContext) {        //返回值需要修改//        return Collections.emptyList();        // 因为自定义的原生View,需要返回native的ViewManager        return Arrays.asList(new NativePaintViewManager());    }}
  • step4 定义Java和JavaScript之间的接口层 NativePaintView.js
import { PropTypes } from 'react';import { requireNativeComponent, View } from 'react-native';var iface = {  name: 'RCTMyPaintView',  propTypes: {    color: PropTypes.string,    raduis: PropTypes.number,    ...View.propTypes // 包含默认的View的属性  },};module.exports = requireNativeComponent('RCTMyPaintView', iface);

注意在这里需要指定color、raduis的属性,分别用PropTypes.string跟PropTypes.number表示,这样的话,在别的地方就可以引用这个组件了

  • step5 使用这个组件
    //导入组件    import PaintView from './NativePaintView';    // 使用     "#FF5984"}                               raduis={100}                    />

最后看下效果:

最后提供代码地址github

更多相关文章

  1. Android用户界面 UI组件--TextView及其子类(四) Chronometer计时
  2. Android界面布局编程
  3. 第27章、流动视图ScrollView(从零开始学Android)
  4. Android实现二维码扫描功能(一)-ZXing插件接入
  5. Android的UI组件 .
  6. Android开发:Android的ListView下拉刷新,基于慕课教程的改进版
  7. Android(安卓)四大组件你都知道吗
  8. Android中常见的安全问题
  9. Android(安卓)JAR组件安装打包教程

随机推荐

  1. Android进程管理机制及优化(HTC&其它可参
  2. Android开机速度 ------之ART预优化dex2o
  3. Android高手进阶教程(二十五)之---Androi
  4. Android(安卓)4.0 触摸屏消息(二大写的二)
  5. Android中的线程处理
  6. Android(安卓)资源,国际化,自适应
  7. Android九宫格图片(9.png)的讲解与制作
  8. 想抢先体验Android操作系统的魅力吗?那就
  9. 如何检索Android设备的唯一ID
  10. Android身陷恶意扣费门 部分开发者参与其