前言

本博客要说的是react-native(以下简称RN)中,怎样去调用Android的原生控件。其实这个官方文档也有说明,但就是没有给出一个完整的例子出来,最近在整理RN的知识点,就想着总结一下这个知识。

步骤

1. 创建ViewManager的子类

public class ReactImageViewManager extends SimpleViewManager<ImageView> {    public static final String REACT_CLASS = "FastImageView";    @Override    public String getName() {        // 返回js端识别的类名        return REACT_CLASS;    }}

2. 实现createViewInstance()方法

@Overrideprotected ImageView createViewInstance(ThemedReactContext reactContext) {    // 实例化原生控件    return new ImageView(reactContext);}

3. 通过ReactProp或者ReactPropGroup注解来导出属性的设置方法

  • ReactProp属性必须包含一个name属性,还有默认值属性,不强制要求设置;
  • 具体参考RN中文文档
// js端设置属性的方法    @ReactProp(name = "src")    public void setSrc(ImageView iv, ReadableMap source) {    // TODO 解析js端传过来的source//        iv.setImageResource(R.mipmap.ic_launcher);        Glide.with(iv.getContext().getApplicationContext())                .load("http://c.hiphotos.baidu.com/image/pic/item/7acb0a46f21fbe09810db97167600c338744ad00.jpg")                .placeholder(R.mipmap.ic_launcher)                .error(R.mipmap.ic_launcher)                .into(iv);    }

4. 注册ViewManager

  • 原生端最后一步是把我们写好的ViewManager注册到ReactPackage中
 @Override public List createViewManagers(ReactApplicationContext reactContext) {    return Arrays.asList(        new ReactImageViewManager()    );}

5. js端封装原生控件

  • 为了方便调用,会将原生的控件封装成react端单独的一个控件
"use strict";import React from 'react';import PropTypes from 'prop-types'import {    requireNativeComponent,    View,} from 'react-native';class NewFastImage extends React.Component {    render() {        return (            this.props}                src={this.props.source}            />        )    }}NewFastImage.priority = {    low: 'low',    normal: 'normal',    high: 'high',}const FastImageSourcePropType = PropTypes.shape({    uri: PropTypes.string,    headers: PropTypes.objectOf(PropTypes.string),    priority: PropTypes.oneOf(Object.keys(NewFastImage.priority)),})NewFastImage.propTypes = {    ...View.propTypes,    // 该属性对应原生的setSrc方法,必须要有    src: PropTypes.oneOfType([FastImageSourcePropType, PropTypes.number]),};// FastImageView是我们在原生控件暴露给js端的名字,必须一样const FastIV = requireNativeComponent('FastImageView', NewFastImage);export default NewFastImage;

6. 控件调用

  • 到了这一步,基本就完成了。但有一点要说一下,控件是没有默认大小的,必须要在样式中设置大小才能显示。
render() {        return (            <View style={{flex: 1}}>                <NewFastImage source={{uri: '网络图片url'}} style={{width: 100, height: 50, borderRadius: 20}}/>            View>        );    }

更多相关文章

  1. Android(安卓)边框圆角
  2. Android(安卓)TextView中文字设置超链接、颜色、字体 大杂烩
  3. Android(安卓)ViewPager 取消预加载
  4. 为什么应用商店里搜索不到你的App?
  5. Android(安卓)Adapter 源码笔记(3)
  6. Android(安卓)tMeasureSpec 含义
  7. Android(安卓)TabHost设置setCurrentTab(index),当index!=0时,默认加
  8. android ActionBar用法详解
  9. android设置显示语言

随机推荐

  1. Android(安卓)API Guides----Adding Cust
  2. Android(安卓)中的拿来主义(编译,反编译,AX
  3. Android[安卓] 版Air Video 远程播放电脑
  4. Android(安卓)沉浸式模式与常见状态栏和
  5. MAC Android(安卓)Studio编写Android(安
  6. 理解Android(安卓)Java垃圾回收机制
  7. Android获取手机WiFi IP地址,MAC地址和网
  8. 超详细的Android系统50大必备秘籍分享
  9. Android(安卓)apk安装过程及Java、JNI读
  10. 第七章 ARM 反汇编基础(三)(ARM 原生程序的