React Native使用原生UI组件

react-native入门之核心组件与原生组件 文档:https://reactnative.cn/docs/intro-react-native-components 1.简介 React Native 是一个使用React和应用平台的原生功能来构建 Android 和 iOS 应用的开源框架。 通过 React Native,您可以使用 JavaScript 来访问移动平台的 API,以及使用 React 组件来描述 UI 的外观和行为:一系列可重用、可嵌套的代码。 2.视图(Views)与移动开发 在 Androi... 阅读详情

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

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

原生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<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

        List<NativeModule> modules = new ArrayList<>();
        //将我们创建的类添加进原生模块列表中
        modules.add(new MyNativeModule(reactContext));
        return modules;
    }


    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {

        //返回值需要修改
        return Collections.emptyList();
    }


    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {

        //返回值需要修改
//        return Collections.emptyList();

        // 因为自定义的原生View,需要返回native的ViewManager
        return Arrays.<ViewManager>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';

    // 使用
     <PaintView style={styles.paintview}
                               color={"#FF5984"}
                               raduis={100}
                    />

最后看下效果:

demo

最后提供代码地址github

React Native原生模块开发与实践 本文详细介绍了React Native中创建原生模块的步骤,包括如何创建视图、管理器和包类,并在Android Studio中构建和测试。从定义UI组件的Java类,到通过ReactPackage将原生模块集成到React Native项目中,再到从JavaScript渲染原生视图,每个环节都有详尽的解释和代码示例。 阅读详情

相关推荐

AI:Coze、Dify、n8n:三款低代码工具如何选?

Coze、Dify、n8n:三款低代码工具如何选?

Kant2048的博客 2806

React Native学习------封装原生UI组件(iOS)

原生开发,发展到今天已经非常成熟完善,已有组件成千上万,极大的提高了开发效率。而React Native 在Facebook的React.js conf 2015上提出,至今一年多,组件数目肯定没得和原生的相比。因此,在使用React Native开发App的过程中,我们可能需要调用RN没有实现的原生视图组件或第三方组件。甚至,我们可以把本地模块构造成一个React Native组件,提供给别人使...

chelongfei的博客 1841

【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系

多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。

一起来交流学习吧 1万+

Android React Native使用原生UI组件

Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手封装一下,从而能够使用那些React Native没有为我们封装的原生组件,比如WebView,官方并没有提供Android端的实现,那么我们现在就动手封装一下WebView。

区长的专栏 1万+

在国产麒麟V10(arm64)上离线部署Docker 24.0.6和Compose 2.30.1,保姆级避坑实录

本文详细介绍了在国产麒麟V10(arm64)操作系统上离线部署Docker 24.0.6和Compose 2.30.1的完整流程,包括环境准备、架构认知、安装步骤、系统服务优化及生产环境加固。特别针对ARM64架构的兼容性问题提供了解决方案,帮助用户在信创环境中高效部署容器化技术。

weixin_30342209的博客 484

python语言字符串练习题

描述:find()方法检测字符串中是否包含子字符串str,如果指定 beg(开始)和end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串,返回字符串中,子字符串第一个字符的索引值,否则返回-1。描述:find()方法用来检测字符串中是否包含子字符串str,在指定范围内,如果包含子字符串,返回字符串中,子字符串第一个字符的位置,否则返回-1。命令行先后输入两个字符串,然后利用find()方法找出第二个字符串在第一个字符串中出现的位置。本关需要你编写一个程序,输出字符串的长度。

国家一级致癌物 2025

ReactNative 调用Android 原生(二)——原生组件

ReactNative 调用Android 原生(一)——原生模块(一):https://blog.youkuaiyun.com/danfengw/article/details/83862623 ReactNative 调用Android 原生(一)——原生模块(二): https://blog.youkuaiyun.com/danfengw/article/details/83901889 先说下我遇到的坑: 原本学...

danfengw的博客 1094

【气候极端指数】MATLAB计算各种气候极端指数

简介各类气候极端指数,及其MATLAB计算代码

WW、forever的博客 4917

android原生 ui 组件,React Native 使用原生 UI 组件

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

weixin_33296185的博客 530

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

React Native与原生通信

一、RN与安卓通信 1、RN调用安卓原生组件 2、RN用消息机制方式与安卓原生代码切换 3、RN用Promise机制与安卓原生代码通信 4、RN用callback回调方式与安卓原生代码通信 二、RN与IOS通信 1、定义导出的方法名 2、promise实现的回调函数 3、继承RCTEventEmitter类

胡乱学点东西 1854

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

React Native 原生UI组件的基本使用

上文中提到原生模块的使用,现在来简单介绍一下原生UI组件的使用: 1. 首先定义你要显示的原生view: package com.demo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.view.View; publ

lixuce1234的博客 569

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

React Native 使用原生 UI 组件

原文链接:http://blog.youkuaiyun.com/imSunLight/article/details/62044273 https://juejin.im/entry/58c8e4c7a22b9d0064130304?utm_source=tuicool&utm_medium=referral 在之前的一篇文章中,我记录了已有的 Android 项目如何接入 React Nativ

大灰狼的小绵羊哥哥的博客 1215

React Native 封装原生UI组件并使用的流程(iOS)

http://www.jianshu.com/p/e16c91acce03

openglnewbee的博客 3002

React 与 React Native 的区别:Web 与移动开发的选择

🤍 前端开发工程师、技术日更博主、已过CET6🍨、23年度博客之星前端领域TOP1🕠高级专题作者、打造专栏🍚签约作者、上架课程。

你若盛开,清风自来 1685

React Native使用指南-原生UI组件

在如今的App中,已经有成千上万的原生UI部件了——其中的一些是平台的一部分,另一些可能来自于一些第三方库,而且可能你自己还收藏了很多。React Native已经封装了大部分最常见的组件,譬如ScrollView和TextInput,但不可能封装全部组件。而且,说不定你曾经为自己以前的App还封装过一些组件,React Native肯定没法包含它们。幸运的是,在React Naitve应用程序中

有志者事竟成-程序员也可以创造优雅的艺术 2515

深入浅出 React Native:使用 JavaScript 构建原生应用

数月前,Facebook 对外宣布了正在开发的 React Native 框架[https://code.facebook.com/videos/786462671439502/react-js-conf-2015-keynote-introducing-react-native-/],这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了[htt

ljloving的专栏 952

React Native UI Kitten 开源项目常见问题解决方案

React Native UI Kitten 开源项目常见问题解决方案 1. 项目基础介绍及主要编程语言 **项目介绍:**React Native UI Kitten 是一个基于 React Native 的开源 UI 库,提供了丰富的 UI 组件,帮助开发者快速构建高质量的原生移动应用。该项目包含了多个常见的界面组件,如登录、个人资料、新闻和聊天界面等。 **主要编程语言:**JavaScri...

gitblog_00488的博客 856

react-native调用Android原生UI组件

当react-native的UI组件不能满足需求时,可以考虑在原生自定UI组件,让RN调用.使用原生UI所考虑的问题: 一.原生UI被调用; 二.修改原生UI属性值; 三.捕捉原生UI的响应; 四.RN向原生UI组件发消息; 下面贴上代码,逐步分析,实现: 1.在原生里自定义UI,创建本地模块封装.   package com.firstapp.widget;   import...

踏雪飞鸿的博客 2113

react native封装原生View思路介绍(android篇)

背景: react native自带的view组件有时无法满足项目中一些特殊需求,或者性能、兼容性有待提升,这时往往就需要从原生入手,封装一套UI供RN上层使用。 原生UI封装步骤:1.创建一个继承自ViewManager的子类: 这里注意到有三个可供继承:ViewManager、BaseViewManager(extend 前者)、SimpleViewManager(extend 前者),我们往...

qq_33539839的博客 1196

react、react-native之间的关系理解

最近在做的APP项目,是在vs code中使用javascript开发的,之前没有接触过,第一次接触,就先来谈谈我自己对RN、原生之间的理解吧。 目录层次结构二级目录优缺点安装配置 层次结构 二级目录 优缺点 安装配置 ...

weixin_43695010的博客 1791

react-native-renderer完全指南:如何用Angular构建跨平台移动应用

react-native-renderer是一个强大的工具,它让开发者能够使用Angular和React Native构建适用于Android和iOS的跨平台移动应用。通过这个工具,你可以充分利用Angular的丰富功能和React Native的原生性能,轻松打造出色的移动应用。 ## 🚀 为什么选择react-native-renderer? 使用Angular和React Native

gitblog_00293的博客 587

android原生 ui 组件,Android原生组件集成RN

原生模块:java:1.ToastModule 实现原生封装核心操作public class ToastModule extends ReactContextBaseJavaModule {//自定义常量private static final String DURATION_SHORT_KEY = "SHORT";private static final String DURATION_LO...

weixin_35057726的博客 365
上一篇: React Native 打包生成apk文件
下一篇: 程序员朋友们,假如你跟我有相同遭遇你会怎么做
imSunLight
博客等级 码龄11年 24粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值