キャンバスラバーバンド線引き塗布方法
2022-01-31 19:55:58
ラバーバンディングとはどういう意味ですか?
描画を輪ゴムのように引き伸ばすことを指します。
例は以下の通りです:point_down。
アイデア
アイデアは非常にシンプルで、輪ゴムの描画機能だけ注目すべき、以下はマウスダウン、マウスムーブ、マウスアップの3段階のアイデアをまとめたものです。
mousedown:開始位置の記録、ドラッグ(ドラッグ状態かどうかの記録)をtrueに設定、getImageData(
Rubber band effect key 1
)
mousemove: ドラッグ時の位置posを取得、putImageData(
Corresponds to getImageData, rubber band effect key 2
), posとstartに基づき線を引く。
マウスアップ:ドラッグをfalseに戻す
key
マウスクリック時の画像を記録するのがputImageData()、復元に対応するのがgetImageData()であり、CanvasのputImageData()、getImageData()メソッドが鍵を握っているのです。この2つのメソッドが実行されないと、次のような効果があります。
putImageData() は、すべての "scanned" 行を消去することと等価です。
コード
<canvas id="canvas" width="600" height="400" style="border: 1px solid black;"> </canvas& gt;
<script type="text/javascript">
let canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
canvasLeft = canvas.getBoundingClientRect().left, //getBoundingClientRect() to get the element position
canvasTop = canvas.getBoundingClientRect().top;
let imageData; //record image data
let start = new Map([['x',null],['y',null]]);
let drag = false;//record whether it is in the dragging state
canvas.onmousedown = function (e) {
let pos = positionInCanvas(e, canvasLeft, canvasTop);
start.set('x', pos.x);
start.set('y', pos.y);
drag = true;
//record imageData
imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
}
canvas.onmousemove = function (e) {
if(drag === true){
let pos = positionInCanvas(e, canvasLeft, canvasTop);
// equivalent to erasing all the scanned lines and redrawing
ctx.putImageData(imageData, 0, 0);
ctx.beginPath();
ctx.moveTo(start.get('x'), start.get('y'));
ctx.lineTo(pos.x, pos.y);
ctx.stroke();
}
}
canvas.onmouseup = function (e) {
drag = false;
}
function positionInCanvas (e, canvasLeft, canvasTop) {//Get the mouse click position in the canvas
return {
x:e.clientX - canvasLeft,
y:e.clientY - canvasTop
}
}
</script>
以上、本記事の全内容をご紹介しましたが、皆様の学習のお役に立てれば幸いです。また、Script Houseをより一層応援していただければ幸いです。
関連
-
キャンバス版体内時計の実装例
-
シェアボタン付きAmazeUIボトムナビゲーションバー用サンプルコード
-
uniapp+Html5 endでPCエンドの適応を実現する。
-
localStorageの最大記憶容量を取得する方法を説明する
-
HTMLメタタグとキーワード
-
html5でhotcss.jsを使い、携帯電話の自己適合を実現する方法
-
円形のプログレスバーを生成する html svg
-
IOSキーボードがfocusoutイベントでしまわれたときに元の場所に戻らない問題を解決する
-
左右の高さの差がありすぎる問題を解決するための小型プログラムウォーターフォール
-
ivxプラットフォーム開発:9箱の抽選機能をコードレスで実装する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
html5 applet fly into the shopping cart (放物線描画モーショントラック・ポイント)
-
Canvasでグラフィックス/イメージバインディングのイベントリスナーを実装する方法
-
Html5ページで携帯電話の仮想キーボードのポップアップを無効化する方法
-
9ボックスグリッドの原則を用いたHTMLページレイアウト
-
HTML5 Canvasタグの解説と基本的な使い方
-
html5 色彩公差キーイング with canvas
-
HTML5によるメッセージ通知の利用(Web Notification)
-
モバイルhtml5で長押しイベントをシミュレートする方法
-
ベッセル曲線の軌跡アニメーションのためのCanvasサンプルコード
-
キャンバスでDVDスタンバイのアニメーションを作成するコード