一、 本博客參考react-native-WaterMark庫,因為顯示情況與要求不符,所以在原基礎上修改一下。
二、 遇到問題與解決方案:
問題: 文字旋轉后,邊角留有空白
解決: 將寬度擴大,使用transform進行旋轉移動
三、 現存問題
1. 固定定位,不能像背景圖一樣移動
四、 代碼
import React, {Component} from "react";
import PropTypes from 'prop-types';
import {Dimensions} from "react-native";
import Svg, {G,Text,}from 'react-native-svg'
let {height , width} = Dimensions.get('window')
class WaterMark extends Component {
constructor(props) {
super(props)
}
render() {
let {canvasWid , canvasHei , txtSpace , txtLines , txtOriginY , txtFont , txtColor , text} = {...this.props}
canvasWid = canvasWid + 150; // 增大寬度,防止邊角留白
let cos = Math.cos( 270 * (180 / Math.PI))
let space = (parseInt(txtSpace) + (parseInt(txtFont) * 2))
let beveling = space / cos
let sideLength = canvasWid + canvasHei
let rowNum = Math.ceil(sideLength / beveling)
let arr = []
let y = txtOriginY
for (let i = 0 ; i < rowNum; i++) {
for (let j = 0; j < txtLines; j++){
let x = canvasWid - canvasWid/(txtLines-1)*j
let svgTxt =
<G key={j+""+i}
transform= {{ rotation:-30,x:[-300,0],y:[90,0]}} >
<Text
x = {x}
y={y}
stroke="transparent"
fill= {txtColor}
fontSize= {txtFont}
>{text}</Text>
</G>;
arr.push(svgTxt)
}
y = y + txtSpace
}
return(
<Svg
pointerEvents="none"
height={canvasHei}
width={canvasWid}
style={{backgroundColor: 'transparent' , position: 'absolute'}} //畫布默認是透明的
>
<G>{arr}</G>
</Svg>
)
}
}
WaterMark.defaultProps = {
canvasWid: width , //水印畫布的寬度
canvasHei: height, //水印畫布的高度
txtSpace: 100, //水印文字之間的行間距
txtLines: 4, //水印的列數
txtOriginY: 20, //文字距離畫布上邊界的距離
txtFont: 11, //水印字體大小
txtColor: "rgba(174,174,174,0.2)", //水印字體顏色
text: '', //水印文字內容
}
WaterMark.propTypes = {
canvasWid: PropTypes.oneOfType([PropTypes.string , PropTypes.number]), //水印畫布的寬度
canvasHei: PropTypes.oneOfType([PropTypes.string , PropTypes.number]), //水印畫布的高度
txtSpace: PropTypes.oneOfType([PropTypes.string , PropTypes.number]), //水印文字之間的行間距
txtLines: PropTypes.oneOfType([PropTypes.string , PropTypes.number]), //水印的列數
txtOriginY: PropTypes.oneOfType([PropTypes.string , PropTypes.number]), //文字距離畫布上邊界的距離
txtFont: PropTypes.oneOfType([PropTypes.string , PropTypes.number]), //水印字體大小
txtColor: PropTypes.string, //水印字體顏色
text: PropTypes.string, //水印文字內容
}
export {WaterMark}
調用方法:
<WaterMark text={"Ayinger水印"}></WaterMark>
