A React Native component for touch based drawing supporting iOS and Android. Inspired by the libraries react-native-sketch, react-native-signature-capture.
This component was written to fulfill the following use cases:
- Basic Touch based drawing for both iOS and android.
- Shouldn't include any UI Elements for interaction. The UI Elements can be created and customized in react native.
- Support touch drawing, erasing of part of drawing, clearing drawing, saving of drawn images locally and opening of locally saved images.
$ npm install react-native-sketch-view --save
or$ yarn add react-native-sketch-view
$ react-native link react-native-sketch-view
- For iOS, open Application Project in Xcode and find
RNSketchView
project underLibraries
Folder.- Drag
SketchViewContainer.xib
into your application project, adding a folder reference instead of copying.
- Drag
import React, { Component } from 'react';
import {
View,
Text,
TouchableHighlight
} from 'react-native';
import SketchView from 'react-native-sketch-view';
const sketchViewConstants = SketchView.constants;
const tools = {};
tools[sketchViewConstants.toolType.pen.id] = {
id: sketchViewConstants.toolType.pen.id,
name: sketchViewConstants.toolType.pen.name,
nextId: sketchViewConstants.toolType.eraser.id
};
tools[sketchViewConstants.toolType.eraser.id] = {
id: sketchViewConstants.toolType.eraser.id,
name: sketchViewConstants.toolType.eraser.name,
nextId: sketchViewConstants.toolType.pen.id
};
class HandNote extends Component {
constructor(props) {
super(props);
this.state = {
toolSelected: sketchViewConstants.toolType.pen.id
};
}
isEraserToolSelected() {
return this.state.toolSelected === sketchViewConstants.toolType.eraser.id;
}
toolChangeClick() {
this.setState({toolSelected: tools[this.state.toolSelected].nextId});
}
getToolName() {
return tools[this.state.toolSelected].name;
}
onSketchSave(saveEvent) {
this.props.onSave && this.props.onSave(saveEvent);
}
render() {
return (
<View style={{flex: 1, flexDirection: 'column'}}>
<SketchView style={{flex: 1, backgroundColor: 'white'}} ref="sketchRef"
selectedTool={this.state.toolSelected}
onSaveSketch={this.onSketchSave.bind(this)}
localSourceImagePath={this.props.localSourceImagePath}/>
<View style={{ flexDirection: 'row', backgroundColor: '#EEE'}}>
<TouchableHighlight underlayColor={"#CCC"} style={{ flex: 1, alignItems: 'center', paddingVertical:20 }} onPress={() => { this.refs.sketchRef.clearSketch() }}>
<Text style={{color:'#888',fontWeight:'600'}}>CLEAR</Text>
</TouchableHighlight>
<TouchableHighlight underlayColor={"#CCC"} style={{ flex: 1, alignItems: 'center', paddingVertical:20, borderLeftWidth:1, borderRightWidth:1, borderColor:'#DDD' }} onPress={() => { this.refs.sketchRef.saveSketch() }}>
<Text style={{color:'#888',fontWeight:'600'}}>SAVE</Text>
</TouchableHighlight>
<TouchableHighlight underlayColor={"#CCC"} style={{ flex: 1, justifyContent:'center', alignItems: 'center', backgroundColor:this.isEraserToolSelected() ? "#CCC" : "rgba(0,0,0,0)" }} onPress={this.toolChangeClick.bind(this)}>
<Text style={{color:'#888',fontWeight:'600'}}>ERASER</Text>
</TouchableHighlight>
</View>
</View>
);
}
}
export default HandNote;
clearSketch()
- Clears the view.saveSketch()
- Initiates saving of sketch.changeTool(toolId)
- Changes selected tool.- Tool Id can be found using SketchView tooltype constants eg.
SketchView.constants.toolType.pen.id
- Tool Id can be found using SketchView tooltype constants eg.
- Pen -
SketchView.constants.toolType.pen
- Eraser -
SketchView.constants.toolType.eraser
selectedTool
- Set the tool id to be selected.toolColor
- Set color for pen, using CSS colors.localSourceImagePath
- Local file path of the image.onSaveSketch(saveArgs)
- Callback when saving is complete.saveArgs
Is an object having the following properties -localFilePath
- Local file path of the saved image.imageWidth
- Width of the saved image.imageHeight
- Height of the saved image.