react-konvaを使ってみる（基本編）

備忘録。使い方や知ったことについて書きますが詳細説明は省くことがあります。
***
#概要
[konva][konva]という2Dグラフィックを描くことができるライブラリをreactの書き方ができるようしたのがreact-konvaライブラリです。今回は導入と基本的な書き方を書いていきます。
####環境
| |version|
|:-:|:-:|
|React| 17.0.2  |   
|Konva|  17.0.2-5 |   
|react-konva| 8.1.3  | 
reactのtypescriptのテンプレートから作成します。

``` 
npx create-react-app --template typescript myapp
```

#導入
``` 
# npm の場合
npm install react-konva konva --save
# yarnの場合
yarn add react-konva konva
```

#概念
ここでは説明しません。
知りたい場合はほかの記事やkonvaについて調べてください。

#基本的な使い方
```typescript:app.tsx
import { Stage, Layer, Rect } from 'react-konva';

function App() {
  return (
    <Stage width={500} height={500}>
      <Layer>
        <Rect fill='red' width={300} height={200} />
      </Layer>
    </Stage>
  );
}

export default App;
```
![スクリーンショット (64).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894586/e786b521-905f-b9f9-2baa-c7c8584feb43.png)

これが最低限のコードです。赤い四角がありますが画面のサイズもわかりません。

・`<Stage>`・・・描画の土台。width、heightは画面のサイズ。可変にするとエラーや予期しない動作をするので固定値にしましょう。
・`<Layer>`・・・名前の通り。
・`<Rect>`・・・描画用タグ。この部分が描画される。

注意：`<Stage>`、`<Layer>`は必須です。どれだけ描画部分を記述しても何も表示されません。ただし、警告は出ますがエラーとしてページが停止することはありません。
`<Stage>`、`<Layer>`が一つでもある場合、その外に`<Rect>`等を記述するとコマンドプロンプト上は正常に動作している判断し、警告も出ません。気を付けてください。

#種類
描画用タグは[konva公式サイト][konva_rect]には全部で17種あります。
今回は基本的な四角を描画する`<Rect>`、真円を描画する`<Circle>`、文字列を描画する`<Text>`、画像を描画する`<Image>`について使用方法を書いていきます。

##Rect
```typescript:app.tsx
import { Stage, Layer, Rect } from 'react-konva';

function App() {
  return (
    <Stage width={500} height={500}>
      <Layer>
　　　　{/*枠です。見やすくするためにあります。*/}
        <Rect stroke='black' strokeWidth={1} x={0} y={0} width={500} height={500} />
        <Rect fill='red' x={100} y={100} width={300} height={200} />
      </Layer>
    </Stage>
  );
}

export default App;

```
![スクリーンショット (65).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894586/0feb85bb-6025-7a1b-0a08-f866bc962677.png)

・`fill`・・・色
・`x`、`y`・・・座標
・`width`、`height`・・・四角のサイズ

すべてのタグに共通しますが`x`、`y`の座標は`<Stage>`のサイズを超える座標に置くと見えなくなったり、途中で途切れたりします。

##Circle
```typescript:app.tsx
import { Stage, Layer, Circle  } from 'react-konva';

function App() {
  return (
    <Stage width={500} height={500}>
      <Layer>
　　　　{/*枠です。見やすくするためにあります。*/}
        <Rect stroke='black' strokeWidth={1} x={0} y={0} width={500} height={500} />
        <Circle fill='red' x={200} y={200} radius={150} />
      </Layer>
    </Stage>
  );
}

export default App;

```
![スクリーンショット (66).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894586/24ecf4c4-7ec7-4bd9-a04d-60b2dfe464ab.png)

・`fill`・・・色
・`x`、`y`・・・中心座標
・`radius`・・・半径

##Text
```typescript:app.tsx
import { Stage, Layer, Text} from 'react-konva';

function App() {
  return (
    <Stage width={500} height={500}>
      <Layer>
　　　　{/*枠です。見やすくするためにあります。*/}
        <Rect stroke='black' strokeWidth={1} x={0} y={0} width={500} height={500} />
          <Text text='aaaあああ' width={300} height={200} />
      </Layer>
    </Stage>
  );
}

export default App;

```
![スクリーンショット (67).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894586/4df4a76a-f2ed-1d41-0c5e-d2ddd712d5c4.png)

・`text`・・・テキスト
・`width`、`height`・・・文字を入れる枠のサイズ。テキストボックスのサイズ。

##Image
```typescript:app.tsx
import { Stage, Layer, Image} from 'react-konva';
import logo from './logo.svg';

function App() {
  let img = new window.Image();
  img.src = logo;
  return (
    <Stage width={500} height={500}>
      <Layer>
　　　　{/*枠です。見やすくするためにあります。*/}
        <Rect stroke='black' strokeWidth={1} x={0} y={0} width={500} height={500} />
          <Image image={img} width={img.width} height={img.height} />
      </Layer>
    </Stage>
  );
}

export default App;

```
![スクリーンショット (68).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894586/3c358693-4039-dab8-be43-fabb1a40a713.png)

・`image`・・・画像。型に注意が必要。
・`width`、`height`・・・画像サイズ。基本的には画像のサイズをそのまま使うのがいいが別途に設定すると横に引き延ばした画像になる。

#終わりに

#参考サイト
[react-konvaライブラリが使って便利だったので使用法などをメモ][link1]
[link1]:https://qiita.com/YSRKEN/items/bb8b34510d70ec90eb50
[konva公式サイト][konva]
[konva]:https://konvajs.org/
[konva_rect]:https://konvajs.org/docs/shapes/Rect.html