• react-native-video 是一个播放视频的开源组件, 它的用法很简单。 1.安装 依次执行下面两个命令, npm i -S react-native-video react-native link (这一步是连接本地视频库) (1) ios: 如果您想允许其他应用...

     react-native-video 是一个播放视频的开源组件,

    它的用法很简单。

    1.安装

    依次执行下面两个命令,

    npm i -S react-native-video

    react-native link            (这一步是连接本地视频库)


    (1) ios:

    如果您想允许其他应用在您的视频组件上播放音乐,请添加:

    AppDelegate.m

    #import <AVFoundation/AVFoundation.h>  // import
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
      ...
      [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];  // allow
      ...
    }
    (2)android

    如果link失败的话需要执行下面的操作:

    android/ settings.gradle

    include ':react-native-video'
    project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android')

    build.gradle

    dependencies {
       ...
       compile project(':react-native-video')
    }

    MainApplication.java

    导入:

    import  com.brentvatne.react.ReactVideoPackage ;

    ReactVideoPackage添加到导出的包列表中。

    @Override 
    protected  List < ReactPackage > getPackages(){
         return  Arrays asList(
                 new  MainReactPackage(),
                 new  ReactVideoPackage()  //添加这个
        );
    }


    2.导入组件

    import Video from 'react-native-video';

    3.使用:

    <Video
        ref={(ref: Video) => {
            this.video = ref
        }}
        /* For ExoPlayer */
        /* source={{ uri: 'http://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube?as=fmp4_audio_clear,fmp4_sd_hd_clear&sparams=ip,ipbits,expire,source,id,as&ip=0.0.0.0&ipbits=0&expire=19000000000&signature=51AF5F39AB0CEC3E5497CD9C900EBFEAECCCB5C7.8506521BFC350652163895D4C26DEE124209AA9E&key=ik0', type: 'mpd' }} */
        source={require('./video/bb.mp4')}
        style={styles.fullScreen}
        rate={this.state.rate}                          // 控制暂停/播放,0 代表暂停paused, 1代表播放normal.
        paused={false}
        volume={1}                   // 声音的放大倍数,0 代表没有声音,就是静音muted, 1 代表正常音量 normal,更大的数字表示放大的倍数
        muted={true}                  // true代表静音,默认为false.
        resizeMode='cover'       // 视频的自适应伸缩铺放行为,
        onLoad={this.onLoad}                       // 当视频加载完毕时的回调函数
        onLoadStart={this.loadStart}            // 当视频开始加载时的回调函数
        onProgress={this.onProgress}   //  进度控制,每250ms调用一次,以获取视频播放的进度
        onEnd={this.onEnd}             // 当视频播放完毕后的回调函数
        onError={this.videoError}    // 当视频不能加载,或出错后的回调函数
        onAudioBecomingNoisy={this.onAudioBecomingNoisy}
        onAudioFocusChanged={this.onAudioFocusChanged}
        repeat={false}                            // 是否重复播放
    />

    这个是style样式,仅供参考:

    fullScreen: {
        position: 'absolute',
        top: 0,
        left: 0,
        bottom: 0,
        right: 0,
    },


    想要控制视频的暂停和播放,可以设置paused,例如

    paused={this.state.paused}

    paused为true是暂停状态,false是播放状态
    <Button title={this.state.paused === false ? '暂停' : '播放'} onPress={this._play}/>
    
    _play() {
        this.setState({
            paused: !this.state.paused
        })
    }
    上面的代码就是在视频下放有个按钮,是播放状态的时候按钮显示 “暂停” 两字,暂停的时候显示“播放”。

    点击按钮改变this.state.paused的值,以此来控制视频的播放和暂停。


    source={require('这里放视频的路径,使用方法跟图片的一样,也可以用网络上的视频地址')}

    还有一些常用方法:

     volume = { 1.0 }                             // 0静音,1是正常的。
           muted = { false }                            //完全静音。
           paused = { false }                           //完全暂停播放。
           resizeMode =  cover                       //以纵横比填充整个屏幕。* 
           repeat = { true }                            //永远重复。
           playInBackground = { false }                 //当应用程序输入背景音频时,音频继续播放。
           playWhenInactive = { false }                 // [iOS]当显示控制或通知中心时,视频继续播放。
           ignoreSilentSwitch = {  ignore  }            // [iOS] ignore | 服从 - 当'忽略'时,音频仍然会播放与iOS硬静音开关设置为静音。当“服从”时,音频将切换开关。当未指定时,将照常继承音频设置。
           progressUpdateInterval = { 250.0 }           // [iOS] Interval to fire onProgress(默认为 
           〜250ms  onLoadStart = { thisloadStart }             //视频开始加载时的回调 
           onLoad = { thissetDuration }                //视频加载时的回调 
           onProgress = { this时刻设定 }                //回调每250毫秒〜与currentTime的 
           onEnd = { onEnd }                       //播放完成时的回调 
           onError = { thisvideoError }                //当视频无法加载时,在 
           CallBuffer = { thisonBuffer }                 //当远程视频正在缓冲时,回调 
           onTimedMetadata = { thisonTimedMetadata }   //当流接收到一些元数据 

    Android扩展文件使用

    //在你的渲染功能,假设你有一个名为
    // “background.mp4”在您的扩展文件。只需添加主要和(如果适用)补丁版本
    < Video source = {{uri  background ,mainVer 1,patchVer 0 }} //在给定的扩展版本中查找.mp4文件(background.mp4)。
           rate = { 1.0 }                    // 0暂停,1是正常的。
           volume = { 1.0 }                  // 0静音,1是正常的。
           muted = { false }                 //完全静音。
           paused = { false }                //完全暂停播放。
           resizeMode =  cover            //以纵横比填充整个屏幕。
           repeat = { true }                 //永远重复。
           onLoadStart = { thisloadStart } //视频开始加载时的回调 
           onLoad = { thissetDuration }     //视频加载时的回调 
           onProgress = { this时刻设定 }     //回调每250毫秒〜与currentTime的 
           onEnd = {onEnd }            //播放完成时的回调 
           onError = { thisvideoError }     //视频无法加载时回调 
           style = { stylesbackgroundVideo } / >
    

    在iOS背景播放

    要使音频在iOS背景下播放,需要将音频会话设置为AVAudioSessionCategoryPlayback


    属性和方法都在上面注释的很清楚了


    展开全文
  • React-Native 与Iconfont整合 1、从阿里妈妈上选择自己所需要的素材,下载源代码 ... 下载后得到的iconfont.ttf ...两种解决方案: react-native-vector-icons && react-native-svg 采用 react-native-svg解
    React-Native 与Iconfont整合

    1、从阿里妈妈上选择自己所需要的素材,下载源代码
    http://www.iconfont.cn/
    下载后得到的iconfont.ttf iconfont.svg.js即为所需文件

    两种解决方案: react-native-vector-icons && react-native-svg

    采用 react-native-svg解决方案:
    (1)下载依赖包 react-native-svg
    yarn add react-native-svg
    执行link操作
    react-native link react-native-svg
    (2)在android/settings.gradle文件追加如下几行:
    include ':react-native-svg'
    project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android')
    (3)在android/app/build.gradle中插入依赖模块
    compile project(':react-native-svg')
    (4)在 android/app/src/main/java/[...]/MainApplication.java中插入如下操作
    添加 import com.horcrux.svg.SvgPackage;
    在getPackages()方法的返回值中添加 new SvgPackage()

    注意> 编译react-native-svg出现的问题
    error: resource android:style/TextAppearance.Material.Widget.Button.Borderless.Colored not found.
    error: resource android:style/TextAppearance.Material.Widget.Button.Colored not found.
    error: failed linking references.
    是因为svg编译打包使用的是高版本的原因,需要修改自己项目app:build.gradle做对应的升级处理

    下载图标方式
    (1)从阿里妈妈上下载自己需要的各种图标,iconfont.svg即为所需
    (2)自己编写脚本,生成指定格式的图标文件iconfont.svg.js
    (脚本暂时没有进行开发,基本确定采用python/shell/perl脚本进行开发)
    (3)自己手动的添加图标的填充颜色(颜色是统一定制化开发的,在其中填充fill)
    (4)自己封装IconSvg组件
    import React, { Component } from 'react'
    import Svg, { Path } from 'react-native-svg'
    import Icons from '[...]/iconfont.svg.js'

    const ICON_SIZE = { xxs: 15, xs: 18, sm: 21, md: 22, lg: 36 }

    export default SvgIcon extends Component {
    render() {
    const { type, fill, width, height, size, style } = this.props
    return (
    <Svg
    width={width || ICON_SIZE[size] || 22}
    height={height || ICON_SIZE[size] || 22}
    viewBox={Icons.viewBox[type] || '0 0 1024 1024'}
    style={{
    ...style,
    }}
    >
    {
    Icons[type] && Icons[type].map((path, index) => {
    let default_fill = path.fill
    default_fill = fill ? fill : default_fill
    return <Path key={index} d={path.d} fill={default_fill} />
    })
    }
    </Svg>
    )
    }

    }

    (5)使用
    <SvgIcon type='ac_unit' size='40' width='22' height='22' fill='#ccc' />
    展开全文
  • RN使用react-native-image-picker + aliyun-oss-react-native 上传图片 今天记录一下在RN使用react-native-image-picker以及aliyun-oss-react-native完成上传图片 如果是原生和RN混合开发,首先执行以下代码: yarn...

    RN使用react-native-image-picker + aliyun-oss-react-native 上传图片


    今天记录一下在RN使用react-native-image-picker以及aliyun-oss-react-native完成上传图片

    如果是原生和RN混合开发,首先执行以下代码:

    yarn add react-native-image-picker
    yarn add aliyun-oss-react-native

    然后在Android添加依赖:
    1.在android/settings.gradle里增加代码:

    include ':react-native-image-picker'
    project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android')
    
    include ':aliyun-oss-react-native'
    project(':aliyun-oss-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/aliyun-oss-react-native/android')
    
    

    2.在android/app/build.gradle里增加代码:

    dependencies {
    +		compile project(':react-native-image-picker')
    +		compile project(':aliyun-oss-react-native')
    }
    

    3.在android/app/src/main/java/…/MainApplication.java里增加代码

    package com.myapp;
    
    + import com.imagepicker.ImagePickerPackage;
    + import com.reactlibrary.RNAliyunOssPackage;
    
        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
    +           new ImagePickerPackage()
    + 			new RNAliyunOssPackage()
            );
        }
    
    }
    

    RN页面代码:

    import React,{ PureComponent } from 'react';
    import { View, StyleSheet } from 'react-native';
    import { ImagePicker } from 'antd-mobile';
    
    const RNImagePicker = require('react-native-image-picker');
    
    
    export default class Demo extends PureComponent {
    
      state = {
          files: [],
      };
        
      uploadImage = () => {
        const { files } = this.state;
        RNImagePicker.showImagePicker(options, response => {
          console.log('Response = ', response);
          if (response.didCancel) {
            console.log('User cancelled photo picker');
          } else if (response.error) {
            console.log('ImagePicker Error: ', response.error);
          } else if (response.customButton) {
            console.log('User tapped custom button: ', response.customButton);
          } else {
            this.props.dispatch({
              type: 'demo/uploadOssFiles',
              payload: [{ ...response }],
              callback: (res = '') => {
                console.log(res, '@@@');
                this.setState({
                  files: [...files, { ...response, url: response.uri }],
                });
              },
            });
          }
        });
      };
    
      render() {
        return (
          <View style={styles.scrollView}>
    	   	  <ImagePicker 
    	   	  	multiple 
    	   	  	files={files} 
    	   	  	onAddImageClick={this.uploadImage}/>
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      scrollView: {
        flex: 1,
        height: '100%',
      },
    });
    

    modal层代码:

        // 图片上传
        *uploadOssFiles({ payload, callback }) {
          const proArr = payload.map(async subitem => {
          	//payload对象是array数组,首先需要遍历出来
            const fileUri = ossupload(subitem);
            return fileUri;
          });
          // 用Promise等待fileUri返回值
          const data = yield Promise.all(proArr, ret => ret);
          callback && callback(data);
        },
    

    上传方法:

    import moment from 'moment';
    import AliyunOSS from 'aliyun-oss-react-native';
    
    const endPoint = 'oss-cn-hangzhou.aliyuncs.com';
    const configuration = {
      maxRetryCount: 3,
      timeoutIntervalForRequest: 30,
      timeoutIntervalForResource: 24 * 60 * 60,
    };
    
    const bucketname = 'myBucketname';
    const urlCdn = 'https://myCDN.cn/';
    
    //根据AliyunOss配置AccessKey
    AliyunOSS.initWithPlainTextAccessKey('xxxxxx', 'xxxxxx', endPoint, configuration);
    
    export const uploadOssFile = filepath => {
      const filetype = filepath.substring(filepath.lastIndexOf('.')).toLowerCase();
      //获取图片后缀
    
      const currm = moment(new Date());
      const oo = Math.random();
      const objectKey = `upload/assets/${currm.format('YYYYMM')}/${currm}${oo}${filetype}`;
      // 生成objectKey,作为自定义路径
      return AliyunOSS.asyncUpload(bucketname, objectKey, filepath)
        .then(() => {
          return `${urlCdn}${objectKey}`;
        })
        .catch(error => {
          console.log('=== error', error);
        });
    };
    
    

    AliyunOSS的具体配置请看这里

    react-native-image-picker导入有问题的看这里

    本文只记录一下个人的使用案例,不具有代表性 ?

    展开全文
  • 由于前段时间写了一个React-Native的项目Mung,里面有一个图片浏览的功能,一般图片浏览都需要放大缩小和左右滑动,后来找了两个这方面比较好的控件react-native-gallery和react-native-image-viewer,但他们都有些...

    由于前段时间写了一个React-Native的项目**Mung,里面有一个图片浏览的功能,一般图片浏览都需要放大缩小和左右滑动,后来找了两个这方面比较好的控件react-native-galleryreact-native-image-viewer**,但他们都有些问题,要不就卡顿,要不就滑动效果不会,这个其实跟React-Native触摸机制有关系,文章后面会提一下,后面就放弃了放大缩小的功能,实现左右滑动(这个比较简单),这几天有时间搞了下。

    思路

    网络图片.jpg

      1. 没思路,滑动还是比较简单的,但手指缩放和滑动一起要做流畅的兼容,而且之前有人已经写了,他们都没写好(可能是RN版本的限制),所以先看资料在看看能不能选择一个进行优化一下实现更加流程的效果,所以选择优化现成的图片缩放控件,使其更加适合图片浏览

    方法

    • 本控件主要是为了实现图片缩放和左右滑动切换用的,大致说一下React-Native触摸机制问题。
    • React-Native实现触摸相关的方法一般读书去实现PanResponder这个方法,感兴趣的可以点进去看一下,一般触摸一个控件是由上到下。在用户开始触摸的时候调用onStartShouldSetPanResponder(手指刚刚接触屏幕的瞬间),是否愿意成为响应者,放回true将接管触摸监听,还有一个就是onMoveShouldSetResponder如果View不是响应者,那么在每一个触摸点开始移动(没有停下也没有离开屏幕)时再询问一次:是否愿意响应触摸交互呢。其实还有很多,但现在只实现左右滑动(这里指的是用三方控件实现左右滑例如Swiper等)就会有问题,大致是,当你将onStartShouldSetPanResponder设置为true它将完全接管触摸,但有时候你可能是按下后左滑,这时你实现左右滑的控件将接受不到这个触摸,只有当手指抬起结束这次触摸才可以。如果你在onMoveShouldSetResponder设置为为true的话,将接受不到单机事件,这个可能会遇到的问题,解决办法在源码里,感兴趣的可以看下,缩放的算法直接使用的是react-native-image-viewer里面的。

    效果

    icon1.gif

    使用

    yarn add react-native-zoom-view 或 npm install react-native-zoom-view

    实现缩放和左右滑
    import Swiper from 'react-native-swiper'
    import ViewControl from 'react-native-zoom-view'
    
    renderSwiperItemView() {
            const imgs = [
                'http://img1.ph.126.net/u1dVCkMgF8qSqqQLXlBFQg==/6631395420169075600.jpg',
                'http://img2.ph.126.net/PqPdn4nhTSXTlPfDE_igJg==/6631322852401020356.jpg',
                'http://img1.ph.126.net/Ta6-WaHwuYMSehnn6Xcmyg==/6631426206490316698.jpg',
                'http://img0.ph.126.net/bCkBoPHS4d32mUJPqBIYrQ==/6631803338979839988.jpg',
                'http://img2.ph.126.net/bkaOfRyDoyddXri0GjpWjA==/6630608169839463386.jpg',
            ];
            return imgs.map((item,i)=>{
                return (
                    <ViewControl
                        key={i}
                        cropWidth={width}
                        cropHeight={height}
                        imageWidth={width}
                        imageHeight={height}>
                        <Image
                            style={{
                                width:width,
                                height:height,
                                resizeMode: 'contain'
                            }}
                            source={{
                                uri:item
                            }}/>
                    </ViewControl>
                )
            })
        }
    
        render() {
            return (
                <Swiper
                    loop={false}
                    showsPagination={false}>
                    {this.renderSwiperItemView()}
                </Swiper>
            );
        }
    
    

    GitHub地址

    后期有时间会基于这个封装出类似微信朋友圈的图片缩放,拖拽,如果有时间的滑,文章写的比较乱,,,慢慢积累。


    React-Native 篇

    七分设计感的纯React-Native项目Mung

    一个完整小巧的Redux全家桶项目

    react-native拖拽排序

    多功能React-Native-Toast组件

    展开全文
  • 通过npm安装react-native-swiper $ npm install react-native-swiper --save $ npm i react-timer-mixin --save 二.在项目中导入 import Swiper from 'react-native-swiper'; 三.使用 render(){ return

    一.通过npm安装react-native-swiper

    $ npm install react-native-swiper --save
    $ npm i react-timer-mixin --save


    二.在项目中导入

    import Swiper from 'react-native-swiper';


    三.使用

      render(){
        return(
            <View>
              <Swiper height={200}
                      loop={true}
                      // showsButtons={true}
                      index={0}
                      autoplay={true}
                      horizontal={false}
                      >
                   {this.renderImg()}
    //轮播图的元素可以是任意空间 这里添加一组图片+文字(Text)会依次显示<span style="white-space:pre">	</span>
               </Swiper>
            </View>
    
        );
      }


      renderImg(){
              var imageViews=[];
              for(var i=0;i<images.length;i++){
                  imageViews.push(
                      <Image
                          key={i}
                          style={{flex:1}}
                          source={{uri:images[i]}}
                          />
                  );
              }
              imageViews.push(<Text>lalala</Text>);
              return imageViews;
          }



    四.相关属性说明

    1.Basic

    Prop Default Type Description
    horizontal true bool 如果值为true时,那么滚动的内容将是横向排列的,而不是垂直于列中的。
    loop true bool 如果设置为false,那么滑动到最后一张时,再次滑动将不会展示第一张图片。
    index 0 number 初始进入的页面标识为0的页面。
    showsButtons false bool 如果设置为true,那么就可以使控制按钮(即:左右两侧的箭头)可见。
    autoplay false bool 设置为true,则页面可以自动跳转。

    2.Custom basic style & content

    Prop Default Type Description
    width - number 如果你没有特殊的设置,就通过flex:1默认为全屏。
    height - number 如果你没有特殊的设置,就通过flex:1默认为全屏
    style {...} style 设置页面的样式。

    3.Pagination

    Prop Default Type Description
    showsPagination true bool 默认值为true,在页面下边显示圆点,以标明当前页面位于第几个。
    paginationStyle {...} style 设置页面原点的样式,自定义的样式会和默认样式进行合并。
    renderPagination      
    dot <View style={{backgroundColor:'rgba(0,0,0,.2)', width: 8, height: 8,borderRadius: 4, marginLeft: 3, marginRight: 3, marginTop: 3, marginBottom: 3,}} /> element 可以自定义不是当前圆点的样式
    activeDot <View style={{backgroundColor: '#007aff', width: 8, height: 8, borderRadius: 4, marginLeft: 3, marginRight: 3, marginTop: 3, marginBottom: 3,}} /> element 可以自定义当前页面圆点的样式

    4.Autoplay

    Prop Default Type Description
    autoplay true bool 设置为true可以使页面自动滑动。
    autoplayTimeout 2.5 number 设置每个页面自动滑动停留的时间
    autoplayDirection true bool 圆点的方向允许默认自己控制

    5.Control buttons

    Prop Default Type Description
    showsButtons true bool 是否显示控制箭头按钮
    buttonWrapperStyle
    {position: 'absolute', paddingHorizontal: 15, paddingVertical: 30,  top: 70, left: 0, alignItems:'flex-start'}
    style 定义默认箭头按钮的样式
    nextButton
    <Text style={{fontSize:60, color:'#00a7ec', paddingTop:30, paddingBottom:30}}>‹</Text>
    element 自定义右箭头按钮样式
    prevButton
    <Text style={{fontSize:60, color:'#00a7ec', paddingTop:30, paddingBottom:30}}>›</Text>
    element 自定义左箭头按钮样式





    展开全文
  • 项目中用到了侧滑组件 react-native-swipe-list-view,简单做个笔记。 npm install --save react-native-swipe-list-view import { SwipeListView } from ‘react-native-swipe-list-view’; import { ...
  • sudo npm i watchman react-native-cli -g 2.构建项目 react-native init +项目名 安装过程中勾选gem cocospods … 即可 3.启动项目 npm run ios react-navigation路由 环境搭建 实现路由跳转功能 1.在项目目录...
  • react-native-amap3d 是 react-native 高德地图组件,使用最新 3D SDK,支持 Android + iOS 参考github:https://github.com/qiuxiang/react-native-amap3d 功能 该组件提供的功能可以满足一般的react-native开发...
  • 项目中已经开始使用react-native-router-flux,这个库比较大,内容也比较丰富,它是react-navigation的增强版,添加了如modal,refresh等功能,使用的过程中一点点总结下来,方便以后再用, 使用前:npm i react-...
  • npm install jpush-react-native --savenpm install jcore-react-native --save ## jpush-react-native 1.4.2 版本以后需要同时安装 jcore-react-native 一、自动配置部分(以下命令均在你的 REACT NATIVE PROJECT.....
  • react-native 自定义封装刷新组件几个月没写博客了,最近一直在写reactreact-native,前几天刚发了一版基于react-native混合开发的App,这几天赶快总结下。写过java的同学,再去学习reactreact-native就会比较...
  • react-native-tab-view

    2020-06-13 18:12:34
    @react-native-diy/tabview 一个好用的 TabView 组件,主要基于@react-native-community/viewpager封装,同时配合react-native-web也支持在 Web 上使用 此组件主要是由TabBar和MyViewPager两部分组成: TabBar是基于...
  • 1.安装 react-native-tab-navigator yarn add react-native-tab-navigator 2.页面调用 /** * 主页面 */ import React, {Component} from 'react'; import { View, Image, StyleSheet } from 'react-native'...
  • 参考资料:https://github.com/Microsoft/react-native-code-push 环境:react-native(0.58.6) 第一部分:注册app 1.打开控制台,并执行代码: code-push app add <appName> <os> <platform> ...
  • 此时就需要使用 react-native-sqlite-storage来解决这个问题。 1、环境 react-native 版本0.61、node.js版本12.15.0 2、安装 npminstall--savereact-native-sqlite-storage react-native0.61版本默认lin...
  • 一、用到技术版本 1、react-native(0.59.8) 2、Android:buildToolsVersion = "28.0.3",minSdkVersion = 16,compileSdkVersion = 28,targetSdkVersion = 28,supportLibVersion = "28.0.0...react-native-ca...
  • 1.集成录音react-native-audio 2.集成文件操作react-native-fs 3.集成音频格式转换react-native-audiotransition。上面两个问题不大,第三步有个坑,rn-audio的录音格式为AAC,需要将AAC转成其他音频格式再传给...
  • react-navigation react-navigation 是今年1月份新出的一款react-native导航组件, 才几个月github就三千多star, 半官方身份, fb推荐使用, 据称性能和效果跟原生差不多. 可能是react-native导航组件的未来主流....
  • 1.安装react-native-signature yarn add react-native-signature 2.使用react-native-signature import SignatureView from "react-native-signature"; SignatureView: { screen: SignatureView, navigatio...
1 2 3 4 5 ... 20
收藏数 9,676
精华内容 3,870