小程序基于Taro的Canvas写字效果和背景图水印效果

效果图
在这里插入图片描述
在这里插入图片描述

const SignName: FC<SignNameProps> = ({ dispatch, SignName }) => {
    const router = useRouter()
    const { SignNameInfo } = SignName
    const [Ctx, setCtx] = useState<any>(null)
    const [isButtonDown, setButtonDown] = useState<boolean>(false);
    const [dpr,] = useState<any>(Taro.getSystemInfoSync().pixelRatio);
    const [screen, setScreen] = useState<any>({
        screenWidth: '',
        screenHeight: ''
    })
    useEffect(() => {
        console.log(Taro.getSystemInfoSync().windowHeight);

        Taro.getSystemInfo({
            success: function (res) {
                console.log(res)
                setScreen({
                    screenWidth: res.windowWidth,
                    screenHeight: res.windowHeight - 50
                })
            }
        })

        setTimeout(() => {
            initCanvas()
        }, 500)

    }, [])
    useReady(() => {
    	/在useeffect  中使用无法获取节点
        initCanvas()
    })
    const initCanvas = () => {
        Taro.createSelectorQuery()
            .select('#canvas')
            .fields({
                node: true,
                size: true,
            })
            .exec((res) => {
                setButtonDown(false)
                const width = res[0].width
                const height = res[0].height
                const canvas = res[0].node
                canvas.width = width;
                canvas.height = height;
                const ctx = canvas.getContext('2d')
                ctx.clearRect(0, 0, width, height)//清空画布
                ctx.beginPath()//开始绘制
                ctx.fillStyle = '#ffffff'//设置背景色
                ctx.fillRect(0, 0, width, height)
                for (let i = 0; i < 20; i++) {

                    ctx.rotate((-45 * Math.PI) / 180); // 水印初始偏转角度
                    ctx.font = "16px Arial";
                    ctx.fillStyle = "#EEEFEF";
                    ctx.fillText("日照港南区操作表   日照港南区操作表    日照港南区操作表    日照港南区操作表    日照港南区操作表    日照港南区操作表     ", -200, i * 60);
                    ctx.rotate((45 * Math.PI) / 180); // 把水印偏转角度调整为原来的,不然他会一直转
                }
                setCtx(ctx)
            })


    }

    const move = (event: any) => {

        Ctx.lineTo(event.changedTouches[0].x, event.changedTouches[0].y)

        Ctx.strokeStyle = '#000000';
        Ctx.lineWidth = 2;
        Ctx.lineCap = 'round';
        Ctx.lineJoin = 'round';
        Ctx.stroke();

        Ctx.draw = false;


    }

    const TouchStart = (event) => {
        Ctx.beginPath()
        Ctx.moveTo(event.changedTouches[0].x, event.changedTouches[0].y)
        setButtonDown(true)

    }
    const canvasEnd = () => {
        Ctx.closePath();
        setButtonDown(false)
    }

    const convertCanvasToImage = () => {
        let image: any
        Taro.createSelectorQuery()
            .select('#canvas')
            .fields({
                node: true,
                size: true,
            })
            .exec((res) => {
                const canvas = res[0].node
                image = canvas.toDataURL("image/png");

                console.log(image);
            })


        return image;
    }

    return (
        <View className='SignNamePage'>
            <View className="canvas">
                <Canvas type="2d" onTouchStart={TouchStart} onTouchMove={move} style={`width: 100%; height: 240px;`} canvasId="canvas" id='canvas'>
                </Canvas>

            </View>

            <View className="caozuo">
                <View className="initCanvas" onClick={initCanvas}>清空</View>
                <View className="initCanvas" onClick={convertCanvasToImage}>完成</View>
            </View>
        </View>
    )
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值