如何在React中使用PaperJs?

时间:2019-05-18 10:01:03

标签: reactjs canvas paperjs

我正在尝试在我的React组件之一中使用PaperJs。我不确定组件中的paper.view.onFrame方法在哪里使用

4 个答案:

答案 0 :(得分:2)

实际上,我完全使用一些其他代码编写了您的代码。 Paperjs鼠标事件似乎可以工作,但是其位置与单击位置不同。大约是一个点的2倍。当我单击50,50时,它将得出100,100。我在下面分享我的代码(Ricardo Sanchez的Sketch.js的更新版本):

import paper from "paper";

export default function Sketch() {
  window.onload = function () {
    paper.install(window);
    paper.setup("paper-canvas");
    draw();

    var myPath;

    paper.view.onMouseDown = function(event) {
        myPath = new paper.Path();
        myPath.strokeColor = 'black';
    }
    
    paper.view.onMouseDrag = function(event) {
        myPath.add(event.point);
    }
    
    paper.view.onMouseUp = function(event) {
        var myCircle = new paper.Path.Circle({
            center: event.point,
            radius: 10
        });
        myCircle.strokeColor = 'black';
        myCircle.fillColor = 'white';
    }

    paper.view.draw();
  };

  function draw(event) {
    const path = new paper.Path.Circle({
      center: [80, 50],
      radius: 35,
      fillColor: "red",
    });

    const secondPath = new paper.Path.Circle({
      center: [120, 50],
      radius: 35,
      fillColor: "#00FF00",
    });
  }

  // Most return null
  return null;
}

答案 1 :(得分:1)

我的2美分,希望对您有所帮助。

假设您有一个 MainView 组件,例如:

import React, {Component} from 'react';
import Sketch from './Sketch';

export default class MainView extends Component {

render() {
    return(
        <div>
            <canvas id='paper-canvas' resize='true' />
            <Sketch />
        </div>
    );
  }
}

草图组件将包含您所有的paperjs代码,它是一个简单的功能组件,例如:

import paper from 'paper';

export default function Sketch() {

   window.onload = function() {
       paper.install(window);
       paper.setup('paper-canvas');

       // draw or call your drawing functions here

       view.onFrame = draw;
   }

   function draw(event) {
       // animation loop
   }

   // Most return null
   return null;
}

这对我来说很好,但是目前我在Sketch组件中调用本地paperjs鼠标事件时遇到了问题。如果有人可以帮助,将不胜感激。

欢呼

//行尾

答案 2 :(得分:1)

对于那些正在使用带有钩子的create-react-app中使用paperjs的人。

App.js

import Canvas from './Canvas';
import './App.css';

function App() {
  return (
    <div>
      <Canvas />
    </div>
  );
}

export default App;

Canvas.js

import React, { useRef, useEffect } from 'react';
import Paper from 'paper';
import draw1 from '../drawings/draw1';

const Canvas = props => {
  
  const canvasRef = useRef(null)
  
  useEffect(() => {
    const canvas = canvasRef.current;
    Paper.setup(canvas);
    draw1();
  }, []);
  
  return <canvas ref={canvasRef} {...props} id="canvas" resize="true" />
}

export default Canvas;

draw1.js

import Paper from "paper";

const draw1 = () => {
  let myPath = new Paper.Path();

  Paper.view.onMouseDown = (event) => {
    myPath.strokeColor = "white";
    myPath.strokeWidth = 3;
  };

  Paper.view.onMouseDrag = (event) => {
    myPath.add(event.point);
  };

  Paper.view.draw();
};

export default draw1;

答案 3 :(得分:0)

https://github.com/react-paper/react-paper-bindings

有一个软件包供您查看paperjs和reactjs如何一起实现。

您可以按原样使用该软件包(2018年12月的最新更新似乎还不错),或者您可以看到作者如何将paperjs实现到reactjs项目中。