React Native 封装Android 原生View

作者: immutable | 来源:发表于2016-06-27 16:19 被阅读1319次

虽然React Native平台已经为我们封装了大多数常用的控件,但总有一些我们需要的特殊控件,或者比较小众的控件是没有的.

既然平台没有,那咱自己来呗.

封装单个View

在React Native中有一个Image控件,是用来显示图片的,但功能并不是很强大.例如我在做QQ登录授权回调的时候,会返回给我用户的qq头像,它是这样的格式:http://q.qlogo.cn/qqapp/1104930988/707B047664976D4AAE8A205CD1C9B64F/100, 用Image控件是显示不出来的,但我之前的APP用原生的fresco是没有问题的. 没办法,只能自己包装一个支持这种格式的控件给RN使用.

step 1: 在Android Studio 编写一个供RN端调用的控件.新建ZbzRoundImageView.java

/**
 * Created by lijie on 16/5/25.
 */
public class ZbzRoundImageView extends SimpleViewManager<SimpleDraweeView> {

    private static final String REACT_NAME="RCZbzwlRoundImage";

    @Override
    public String getName() {
        //返回 控件的名字,以便于在RN端调用
        return REACT_NAME;
    }
    //实例化控件,设置相关属性并返回
    @Override
    protected SimpleDraweeView createViewInstance(ThemedReactContext reactContext) {
        SimpleDraweeView sView=new SimpleDraweeView(reactContext);
        GenericDraweeHierarchyBuilder builder =
                new GenericDraweeHierarchyBuilder(reactContext.getResources());
        RoundingParams roundingParams =
                new RoundingParams();
        roundingParams.setBorder(R.color.white, 1.0f);
        roundingParams.setRoundAsCircle(true);
        GenericDraweeHierarchy hierarchy=builder.setFadeDuration(300)
                .setRoundingParams(roundingParams)
                .build();
        sView.setHierarchy(hierarchy);
        return sView;
    }
    //设置该控件的一个属性
    @ReactProp(name = "url")
    public void setUrl(SimpleDraweeView simpleDraweeView,String url){
        KLog.e(""+url);
        simpleDraweeView.setImageURI(Uri.parse(url));
    }
}

step 2: 在RN封装该控件.新建zbzRoundImageView.js

/**
 * Created by lijie on 16/5/25.
 */
'use strict';

import { PropTypes } from 'react';
import { requireNativeComponent, View } from 'react-native';

var iface = {
    name: 'ZbzImageView',
    propTypes: {
        ...View.propTypes,
        url: PropTypes.string,
    },
};

module.exports = requireNativeComponent('RCZbzwlRoundImage', iface);

step 3: 封装完毕后,就可直接在需要的地方使用.

import ZbzRoundImageView from '../modules/zbzRoundImageView';

...
<ZbzRoundImageView 
    style={styles.noLoginImg} url={headerPic}>
</ZbzRoundImageView>
...

用这样的封装方法,可以让所有的原生View都可以移植到RN平台中.

相关文章

网友评论

  • 傲酷菿炸的小沫粼:您好,可以留个联系方式吗?想请教个问题
  • liyb:为什么用Image显示不出来呢
    liyb:@immutable SimpleDraweeView 是一个什么东西?
    liyb:@immutable <Image />不会主动加载这个地址的图片数据?
    immutable:@liyb 类似 http://q.qlogo.cn/qqapp/1104930988/707B047664976D4AAE8A205CD1C9B64F/100 这种地址是动态生成的,是一种数据流,而不是静态的图片 :grin:

本文标题:React Native 封装Android 原生View

本文链接:https://www.haomeiwen.com/subject/zmbzdttx.html