react-native-web-canvas

原创 2017年11月13日 20:44:01

react-native-web-canvas

基于webview实现的canvas画布,提供了默认的几个接口

  1. _pen画笔
  2. _clean橡皮
  3. _addImageUrl以url的方式导入图片
  4. _addImageBase64以base64的方式导入图片
  5. _rotateRight向右旋转
  6. _getBase64把画布以base64的形式导出
  7. 通过props设置画布的宽高
  8. 通过回调的方式获取base64

demo

<WebCanvas 
      handleBase64={this._handleBase64.bind(this)}
      ref='canvas'
      height={500} 
      width={500}
    />

功能实现

_pen(){
this.refs.canvas._pen();
}

_clean(){
this.refs.canvas._clean();
}

// 以url的形式添加背景
_addImageUrl(){
this.refs.canvas._addImageUrl(url);
}

// 以base64的形式添加背景
_addImageBase64(){
this.refs.canvas._addImageBase64(base64);
}

// 得到图片的base64形式
_getBase64(){
this.refs.canvas._getBase64(base64);
}

// 保存base64
_handleBase64(data){
alert(data)
}

// 图片右转
_rotateRight(){
this.refs.canvas._rotateRight();
}

使用

  • git clone git@github.com:qn9301/react-native-web-canvas.git
    • WebCanvas.js文件放入你的项目中
    • import WebCanvas from 'path/to/WebCanvas'即可

在公司项目中遇到了一个需要画板的模块,但是找了很久没有中意的,与项目相符的组件,于是打算自己写一个

知识点

  1. webview
  2. postMessage
  3. canvas
  4. 列表内容

预知内容

  1. 你应该了解rn的webview
  2. postMessage的作用
  3. canvas基本api的使用
  4. js的语法。。这个是废话

贴上代码

constructor(props) {
    super(props);
    this.state = {
      height: this.props.height,
      width: this.props.width
    }
  }

我们希望组件的宽高由外部的父组件决定,webview初始化html的时候也需要设置成跟组件的宽高相同,所以传入了宽和高

  render() {
    return (
      <View style={{width:this.state.width, height:this.state.height}}>  
        <WebView 
          style={{width:this.state.width, height:this.state.height}}
          ref = {(w) => {this.webview = w}}
          onLoad={this.webviewload.bind(this)}
          source={{html: html}}
          onMessage={this.messageHandler.bind(this)}
          javaScriptEnabled={true}
          domStorageEnabled={false}
          automaticallyAdjustContentInsets={true}
          scalesPageToFit={false}
          />
      </View>
    );
  }

1 . 我们将webview组件保存成为这个类的一个属性,而不是this.refs的形式,看着更加清爽
2. 其次我们为webview传入我们自己写好的canvas画布的html代码
3. 监听webview,并在加载成功后注入我们的js代码,注入的代码来初始化我们的canvas画布

  webviewload(){
    // alert('加载成功!')
    this.webview.injectJavaScript('init_canvas('+this.props.width+', '+this.props.height+');');  
  }

调用html中写好的初始化方法,初始化整个画布

通信部分

// 用于监听html想rn发送的信息
onMessage={this.messageHandler.bind(this)}
  messageHandler(e){
    var obj = JSON.parse(e.nativeEvent.data);
    if (obj.action == 0){
      this.props.handleBase64(obj.data);
    }
  } 

唯一的通信只是将canvas转换成base64传到我们的组件

  // 将我们的指令打包成json字符串传送给html
  post(obj){
    this.webview.postMessage(JSON.stringify(obj));
  }
  // 得到图片的base64形式
  _getBase64(){
    this.post({action: 0})
  }

再来看html部分

    window.document.addEventListener('message', function (e){
        var obj = JSON.parse(e.data);
        switch (parseInt(obj.action)){
          case 1:
              /* 铅笔 */
              isclean=false;
              break;
          case 2:
              /* 橡皮 */
              isclean=true;
              break;
          case 3:
              /* 右转 */
              rotateRight();
              break;
          case 4:
              /* url */
              createImg(obj.data);
              break;
          case 5:
              /* case64 */
              createImg(obj.data);
              break;
          case 0:
              /* 返回base64 */
              returnBase64();
              break;
        }
    });

通过postMessage为html传输指令,调用html中的api,实现效果

其他的都是通过html中的js代码实现的,我只是做了一个实现的方法,具体的大家可以根据大家自己的需要改写html代码

版权声明:本文为博主原创文章,转载请注明出处。

自定义View签名画板并保存

项目中用到签名的功能。实现完记录一下。效果图:首先是签名的功能。原理很简单将我们手指一动的轨迹绘制出来就可以了。主要用到了canvas的绘制path的api。 canvas.drawPath(mPat...

天猫Web架构/Pad客户端负责人:如何评价 React Native?

作者:鬼道 Facebook在3.26 F8大会上开源了React Native(Introducing React Native),本文是对React Native的技术背景、规划和风险的概述...

如何将React Native 项目运行在 Web 浏览器上面

React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力。相比之前的 Web app 来说,对于性能和用户体验提升了非常多。 但是 React Nati...

【React Native】把现代web科技带给移动开发者(一)

译注: 这是今年5月份React Native刚发布的时候,在code.facebook.com发布的一篇博客。时隔5个月,这篇文章依然值得一读,尤其是对于想了解为何Facebook要开发并发布Rea...

React Native探索(三):与 react-web 的融合

关于 对于react-native在实际中的应用, facebook官方的说法是react-native是为多平台提供共同的开发方式,而不是说一份代码,多处使用。 然后一份代码能够多处使用还是很...

React Native探索(三):与 react-web 的融合

关于 对于react-native在实际中的应用, facebook官方的说法是react-native是为多平台提供共同的开发方式,而不是说一份代码,多处使用。 然后一份代码能够多处使用还是很...

react native 技术分享

  • 2017年11月28日 19:45
  • 2.36MB
  • 下载

React Native电商项目实战

  • 2017年11月27日 15:43
  • 54B
  • 下载

基于Canvas和React极简游戏(一)

游戏设计思路游戏引擎:游戏循环,游戏原型 我把这个 miniGame的实现看作是业务逻辑的实现。 因为我希望我的react组件可以复用,而不是嵌入太多业务逻辑的代码。 所以import 这个mi...
  • jlin991
  • jlin991
  • 2017年03月19日 11:13
  • 1321
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:react-native-web-canvas
举报原因:
原因补充:

(最多只允许输入30个字)