# react-native-web-canvas **Repository Path**: heidi2176/react-native-web-canvas ## Basic Information - **Project Name**: react-native-web-canvas - **Description**: 通过webview实现的一套canvas画布,提供了通用的画笔、橡皮、旋转、url或base64方式载入图片,导出base64的方法 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2017-09-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 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 ``` ``` # 功能实现 ``` _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 ( {this.webview = w}} onLoad={this.webviewload.bind(this)} source={{html: html}} onMessage={this.messageHandler.bind(this)} javaScriptEnabled={true} domStorageEnabled={false} automaticallyAdjustContentInsets={true} scalesPageToFit={false} /> ); } ``` 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代码 * ps: 刚接触rn的童鞋可以来看看我这个随便写的项目,里面是我练手的项目,我会慢慢把他写完,也会遇到很多坑,欢迎大家来一起踩坑 ,欢迎喜欢的童鞋star * [项目地址](https://github.com/qn9301/react-native-aijinbao)