React Native 中调用 Android 自定义控件

在 React Native 中调用 Android 自定义控件(也称为"原生 UI 组件")涉及以下核心步骤,需同时处理 Android 原生代码和 JavaScript 封装逻辑。以下是实现流程及关键代码示例:


⚙️ ​1. Android 原生自定义 View 实现

自定义一个继承自 View 的类,并实现其属性和绘制逻辑:

java 复制代码
// GradientColorView.java
public class GradientColorView extends View {
    private GradientDrawable mDrawable;
    private int mStartColor;
    private int mEndColor;

    public GradientColorView(Context context) {
        super(context);
        mDrawable = new GradientDrawable(Orientation.LEFT_RIGHT, null);
    }

    public void setStartColor(int color) {
        mStartColor = color;
        invalidate(); // 触发重绘
    }

    public void setEndColor(int color) {
        mEndColor = color;
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDrawable.setColors(new int[]{mStartColor, mEndColor});
        mDrawable.setBounds(0, 0, getWidth(), getHeight());
        mDrawable.draw(canvas);
    }
}

关键点​:

  • 通过 setStartColor/setEndColor 暴露属性修改接口。
  • 调用 invalidate() 确保属性更新后刷新视图。

🧩 ​2. 创建 ViewManager 管理自定义 View

继承 SimpleViewManager<T> 类,将 Java 方法映射为 RN 属性:

typescript 复制代码
// GradientColorViewManager.java
public class GradientColorViewManager extends SimpleViewManager<GradientColorView> {
    public static final String REACT_CLASS = "RCTGradientColorView";

    @Override
    public String getName() {
        return REACT_CLASS; // JS 端引用此名称
    }

    @Override
    protected GradientColorView createViewInstance(ThemedReactContext context) {
        return new GradientColorView(context);
    }

    @ReactProp(name = "startColor", customType = "Color")
    public void setStartColor(GradientColorView view, @Nullable Integer color) {
        view.setStartColor(color); // 接收 JS 传入的颜色值
    }

    @ReactProp(name = "endColor", customType = "Color")
    public void setEndColor(GradientColorView view, @Nullable Integer color) {
        view.setEndColor(color);
    }
}

关键注解​:

  • @ReactProp:定义 JS 属性名与类型(customType="Color" 自动转换颜色字符串为整数)。
  • 方法需为 public void,首个参数为视图实例。

📝 ​3. 注册 ViewManager 到 ReactPackage

在自定义的 ReactPackage 中将 ViewManager 加入注册列表:

typescript 复制代码
// CustomReactPackage.java
public class CustomReactPackage implements ReactPackage {
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext context) {
        return Arrays.<ViewManager>asList(
            new GradientColorViewManager() // 注册自定义 ViewManager
        );
    }

    @Override
    public List<NativeModule> createNativeModules(...) {...} // 若无原生模块,返回空列表
}

集成到 RN ​:

MainApplication.javagetPackages() 中添加此 Package:

arduino 复制代码
.addPackage(new CustomReactPackage()) // 注册自定义包

🌐 ​4. JavaScript 端封装组件

使用 requireNativeComponent 将原生组件映射到 JS:

php 复制代码
// GradientColorView.js
import { requireNativeComponent, ViewPropTypes } from 'react-native';

const NativeGradientColorView = requireNativeComponent('RCTGradientColorView', {
  propTypes: {
    startColor: PropTypes.string, // 颜色字符串(如 "#FF0000")
    endColor: PropTypes.string,
    ...ViewPropTypes // 继承基础 View 属性(如 style)
  }
});

export default NativeGradientColorView;

注意事项​:

  • 名称 'RCTGradientColorView' 需与 ViewManager.getName() 完全一致。
  • 属性类型(如 PropTypes.string)需与 @ReactProp 注解的 Java 类型匹配。

⚡️ ​5. 在 RN 中使用自定义组件

导入封装后的组件并传递属性:

ini 复制代码
import GradientColorView from './GradientColorView';

<GradientColorView
  style={{ width: 200, height: 200 }}
  startColor="#FF0000" // 红色起始
  endColor="#0000FF"   // 蓝色结束
/>

🧪 ​调试常见问题

  1. 属性未生效​:

    • 检查 @ReactPropname 与 JS 属性名是否一致。
    • 确保 Android 的 setColor() 等方法调用了 invalidate()
  2. 类型转换错误​:

    • 颜色需通过 processColor() 转换(若未用 customType="Color")。
  3. 组件未注册​:

    • 确认 ViewManager 已添加到 ReactPackage 并在 getPackages() 加载。

🔚 ​总结流程

graph TD A[Android 自定义 View] --> B[创建 ViewManager 映射属性] B --> C[注册 ViewManager 到 ReactPackage] C --> D[JS 端 requireNativeComponent 封装] D --> E[RN 中使用组件传参]

通过以上步骤,RN 即可调用高性能的 Android 原生 UI 组件,适用于需要复杂绘图、动画或特定平台功能的场景。建议结合 官方文档 和示例代码 进一步调试优化。

相关推荐
用户0940 分钟前
MVI架构如何改变Android开发模式
android·面试·kotlin
梦终剧1 小时前
【Android之路】.sp和界面层次结构
android
2501_916008891 小时前
iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone
zh_xuan2 小时前
Android Handler源码阅读
android
雪饼android之路2 小时前
【Android】 android suspend/resume总结(3)
android·linux
00后程序员张2 小时前
iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动
android·ios·小程序·uni-app·swiftui·cocoa·iphone
molong9313 小时前
Android 应用配置跳转微信小程序
android·微信小程序·小程序
2501_915106323 小时前
iOS 可分发是已经上架了吗?深入解析应用分发状态、ipa 文件上传、TestFlight 测试与 App Store 审核流程
android·ios·小程序·https·uni-app·iphone·webview
安东尼肉店11 小时前
Android compose屏幕适配终极解决方案
android
2501_9160074711 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview