美文网首页React NativeReact NativeReact Native
自定义 React Native 二维码扫描组件(简单,易用!)

自定义 React Native 二维码扫描组件(简单,易用!)

作者: Marno | 来源:发表于2017-05-02 07:53 被阅读3694次

    1.前言

    最近用 React Native 仿写了一下 ofo 应用,涉及到了二维码扫描的功能,在 github 上搜了一下,也没发现一个趁手的二维码扫描组件,所以干脆自己动手写了一个。

    其中使用摄像头实时扫描二维码进行解析的功能,已经通过 react-native-camera 这个库实现了,所以我也只是写了一个可以自定义样式的扫描界面,为了使用方便,我已经将其封装成组件,上传到了 NPM 服务器,下面就大概说一下实现过程以及使用方法。

    2.特性

    • 兼容 RN0.4.0+ 的版本
    • 兼容 Android 和 iOS 平台
    • 支持二维码、条形码扫描
    • 轻松实现各种扫描界面

    3.截图预览

    Twitter WeChat OFO
    QQBrowser Gif1 Gif2

    4.安装

    //第一步
    npm install ac-qrcode --save
    //第二步(react-native-camera 需要 link 后才能使用)
    react-native link
    PS:如果 link 没有成功,会报错。如果没有自动 link,可以手动 link

    5.基本使用

    import { QRScannerView } from 'ac-qrcode';
    
    export default class DefaultScreen extends Component {
        render() {
            return (
                < QRScannerView
                    onScanResultReceived={this.barcodeReceived.bind(this)}
                    renderTopBarView={() => this._renderTitleBar()}
                    renderBottomMenuView={() => this._renderMenu()}
                />
            )
        }
    
        _renderTitleBar(){
            return(
                <Text
                    style={{color:'white',textAlignVertical:'center', textAlign:'center',font:20,padding:12}}
                >这里添加标题</Text>
            );
        }
    
        _renderMenu() {
            return (
                <Text
                    style={{color:'white',textAlignVertical:'center', textAlign:'center',font:20,padding:12}}
                >这里添加底部菜单</Text>
            )
        }
    
        barcodeReceived(e) {
            Toast.show('Type: ' + e.type + '\nData: ' + e.data);
            //console.log(e)
        }
    }
    

    6.属性列表

    属性名 类型 默认值 可选 描述
    maskColor string #0000004D true 遮罩颜色
    borderColor string #000000 true 边框颜色
    cornerColor string #000000 true 转角颜色
    borderWidth number 0 true 边框宽度
    cornerBorderWidth number 4 true 转角宽度
    cornerBorderLength number 20 true 转角长度
    rectHeight number 200 true 扫描狂高度
    rectWidth number 200 true 扫描狂宽度
    isCornerOffset bool false true 转角是否偏移
    cornerOffsetSize number 0 true 转角偏移量
    bottomMenuHeight number 0 true 底部操作菜单高度
    scanBarAnimateTime number 2500 true 扫描线移动速度
    scanBarColor string #22ff00 true 扫描线颜色
    scanBarImage any null true 使用图片扫描线
    scanBarHeight number 1.5 true 扫描线高度
    scanBarMargin number 6 true 扫描线距扫描狂边距
    hintText string 将二维码/条码放入框内,</br>即可自动扫描 true 提示文本
    hintTextStyle object { color: '#fff', </br>fontSize: 14,</br>backgroundColor:'transparent'} true 提示文字样式
    hintTextPosition number 130 true 提示文字位置
    isShowScanBar bool true true 是否显示扫描条
    bottomMenuStyle object - true 底部菜单样式
    renderTopBarView func - flase 绘制顶部操作条组件
    renderBottomMenuView func - false 绘制底部操作条组件
    onScanResultReceived func - false 扫描结果回调

    7.实现简述

    扫描界面可以分为 4 个部分:顶部标题栏,底部操作栏,遮罩层,扫描框。其中顶部标题栏和底部操作栏都是通过暴露方法让用户自己添加的。只有遮罩层和扫描框是传入参数进行设置的。上一张图大概说一下整个界面结构。

    组件代码结构如下,基本是通过使用绝对定位的 View 实现的布局

    <View>
        <Camera>
            {/*顶部标题栏*/}
            <TopBarView />
    
            <View>
                {/*扫描框部分*/}
                <View>
                    {/*扫描框边线*/}
                    <View>
                        {/*扫描条及动画*/}
                        <Animated.View>
                    </View>
    
                    {/*扫描框转角-左上*/}
                    <View />
                    {/*扫描框转角-右上*/}
                    <View />
                    {/*扫描框转角-左下*/}
                    <View />
                    {/*扫描框转角-右下*/}
                    <View />
                </View>
                
                {/*遮罩-上*/}
                <View />
                {/*遮罩-左*/}
                <View />
                {/*遮罩-右*/}
                <View />
                {/*遮罩-下*/}
                <View />
    
                {/*提示文字*/}
               <HintTextView />
            </View>
    
            {/*底部操作栏*/}
            <BottomMenuView>
        </Camera>
    </View>
    

    详细代码比较长,就不一一列出来解释了。主要也比较简单,感觉没啥好说的,就是通过计算组件在屏幕上的坐标位置,进行对应的大小设置而已。感兴趣的可以直接跳转到 github 去看,地址在这里:https://github.com/MarnoDev/AC-QRCode-RN

    顺便提醒一下,因为目前还没有进行优化,所以打开扫码界面的速度感觉会有一些慢,后面有时间会对这些细节进行优化的,具体可以关注我的公众号获取,或者留意下后面我在 github 仓库的更新。


    获取更过 RN 干货,欢迎关注公众号 aMarno 。也欢迎加入 RN 群交流。

    相关文章

      网友评论

      • f30b59929bff:哎 坑比较多 ,而且 作者实现了样式 并没有加相应的功能 不然现在肯定很火了
      • mujimz_小东:楼主为什么我在真机上跑,打开camera页面很长时间才能打开,是camera这个组件的问题吗?
      • 光脚丫的孩子:2018年05月09日14:39:55
        最近有跑成功的么?
        狂野的骚猪:好像没维护RN,现在RN更新了很多组件,都跑不起来~:joy:
      • 叫我马小帅:请问在barcodeReceived中如何停止扫描,因为扫描一次出现弹窗后希望不再调用扫描方法
      • biglyn:如何扫描相册图片
      • 76c38879425a:用了下,扫的还是那么流畅。放在那里几分钟 出现一次 我的相机直接用不了,只能重启才好
      • smlsjq:楼主你的demo跑不起来 ‘Aspect’ of undefined
      • 心所在之处:Undefined is not an object(evaluating '_reactNative DeviceInfo isIPhoneX deprecated'), demo已经跑不起来了
      • 19ccb37c9d67:楼主,为什么你的demo我跑不起来呢?总是报DeviceInfo native module is not installed correctly
      • nimw:react-native-camera会在整个拍照范围内都识别二维码,请问可以设置只在二维码扫描框内识别二维码吗?
        19ccb37c9d67:楼主,为什么你的demo我跑不起来呢?总是报DeviceInfo native module is not installed correctly
        羽纱:可以 不过要修改 react-native-camera在原生端的源码
      • 程序H:群主你好,目前项目中用到您写的框架,但是有开启闪光灯的需求。请问如何修改可以调用?
        羽纱:react-native-camera的flashMode属性可以设置闪光灯,建议群主加一个属性可以传递到react-native-camera,这样使用群主的UI时也可以设置react-native-camera功能。

      本文标题:自定义 React Native 二维码扫描组件(简单,易用!)

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