taro-material
Version:
Mini Program components that implement Google's Material Design.
143 lines (116 loc) • 3.5 kB
JavaScript
import Nerv from "nervjs";
import Taro, { Component } from "@tarojs/taro-h5";
import { View, Canvas, Image } from '@tarojs/components';
import PropTypes from 'prop-types';
import theme from "../styles/theme";
import './Watermark.scss';
const unit = 80;
class RMWatermark extends Component {
state = {
id: null,
width: 300,
height: 150
};
componentWillMount() {}
componentDidMount() {
const id = `watermark-${new Date().getTime()}-${Math.floor(Math.random() * 100)}`;
const res = Taro.getSystemInfoSync();
this.setState({
width: res.windowWidth,
height: res.windowHeight,
id
}, () => {
// setTimeout(()=>{
this.ctx = Taro.createCanvasContext(id, this.$scope);
this.draw();
// }, 2000)
});
}
componentDidShow() {}
componentWillUnmount() {}
componentDidUpdate(nextProps, nextState) {
// this.draw();
}
draw() {
const ctx = this.ctx;
if (!ctx) {
return;
}
const { text, type } = this.props;
const { width, height } = this.state;
const fontSize = theme.typography.fontSize;
const fontColor = theme.palette.text.divider;
ctx.font = `${fontSize * 1 / 1.81}px ${theme.typography.fontFamily}`;
ctx.setFontSize(fontSize * 1 / 1.81);
ctx.setFillStyle(fontColor);
if (type === 'stretch') {
const deg = 45 * Math.PI / 180;
ctx.rotate(deg);
const length = Math.ceil(Math.max(height, width) / Math.sin(deg) / Math.sin(deg) / unit);
for (let j = 0; j <= length; j++) {
for (let i = 0; i <= length; i++) {
ctx.beginPath();
ctx.fillText(text, unit * i, unit * j);
if (j > 0) {
ctx.fillText(text, unit * i, -80 * j);
}
}
}
} else {
ctx.beginPath();
ctx.fillText(text, width - theme.spacing.unit * 4 - fontSize / 2 * text.length, height - theme.spacing.unit * 4);
}
ctx.draw(false, () => {
const { id } = this.state;
Taro.canvasToTempFilePath({
canvasId: id,
quality: 1,
success: res => {
this.setState({
mark: res.tempFilePath
});
}
}, this.$scope);
});
}
render() {
const { id, /* height, */mark } = this.state;
const { customStyle, type, container, onClick } = this.props;
const position = container === 'window' ? 'fixed' : 'absolute';
const positionStyle = {
position
};
const style = {
...customStyle,
...positionStyle
};
const canvasStyle = {
...positionStyle
};
if (mark) {
canvasStyle.display = 'none';
}
return <View className="root" style={style} onClick={onClick}>
{/* mark && <View className={`mark ${type}`} style={{backgroundImage: `url(${mark})`}} /> */}
{mark && <Image className={`mark ${type}`} mode="scaleToFill" src={mark} style={positionStyle} />}
{id && <Canvas canvasId={id} className="canvas" style={canvasStyle} ref={ref => {
this['__taroref_id'] = ref;
}} />}
</View>;
}
}
RMWatermark.defaultProps = {
text: '',
type: 'stretch', // stretch, rightBottom,
customStyle: {},
container: 'window', // parent, window
onClick: () => {}
};
RMWatermark.propTypes = {
text: PropTypes.string,
type: PropTypes.oneOf(['stretch', 'rightBottom']),
customStyle: PropTypes.object,
container: PropTypes.oneOf(['parent', 'window']),
onClick: PropTypes.func
};
export default RMWatermark;