http://hakuhin.hp.infoseek.co.jp/main/as/draw.ht …
上記はFlashでの実装ですが、html+JavaScriptで同じ事を実現するにはどうしたらよいでしょうか?
No.1ベストアンサー
- 回答日時:
onmousedownのマウスの位置を開始地点、onmouseupを終了地点として、
onmouseupのタイミングで開始地点から終了地点に線を引きます。
線を引く方法ですが、
HTMLとJavaScriptで行うには、
<div style="position:absolute;width:1px;height:1px;background-color:blue;></div>
これDOMで作成して、topとleftを指定してたくさん並べれば、青い線が引かれているように表示されます。
(丸い枠線を書くNiftyCornerなどでも使われている方法です)
こういうライブラリを使うのが簡単だと思います。
http://www.walterzorn.com/jsgraphics/jsgraphics_ …
ブラウザが限られますが、canvasなら<div>をたくさん作る必要もなくてlineTo()を呼び出すだけで出来ます。
http://developer.apple.com/documentation/AppleAp …
http://developer.mozilla.org/en/docs/HTML:Canvas
ちょっと違いますが、
http://0xcc.net/blog/archives/000040.html
こういう方法で絵を描くことも出来ます。
<table>のセル1マスを1つのドットとして表していますが、
アイコンなどピクセル数が少ないドット絵を描くなら、この方法が拡大縮小も簡単で良いと思います。
クロージャの説明になっていますが、クロージャがわからなければ
colors=[
[0,0,0,0]
,[0,0,0,0]
,[0,0,0,0]
,[0,0,0,0]
];
このようなグロバール変数に、セルのrowとcolを対応させて色を管理しても良いと思います。
この回答への補足
ご回答ありがとうございます。
「ブラウザが限られる」の注釈の無い方法で試してみました。
>onmousedownのマウスの位置を開始地点、onmouseupを終了地点として、
>onmouseupのタイミングで開始地点から終了地点に線を引きます。
とのアドバイスと、紹介して頂いたライブラリを使って、以下の様に書いてみました。
<html>
<head>
<script type="text/javascript" src="wz_jsgraphics.js"></script>
<script type="text/javascript" src="prototype-1.5.1.2.js"></script>
<script type="text/javascript">
<!--
var fromX;
var fromY;
var toX;
var toY;
window.onload = function (){
Event.observe(window.document, "mousedown", from, false);
Event.observe(window.document, "mouseup", to, false);
}
function from(event){
fromX = Event.pointerX(event);
fromY = Event.pointerY(event);
}
function to(event){
toX = Event.pointerX(event);
toY = Event.pointerY(event);
var jg = new jsGraphics("myCanvas");
jg.setColor("#ff0000"); // red
jg.drawLine(fromX, fromY, toX, toY); // co-ordinates related to "myCanvas"
jg.paint();
}
//-->
</script>
</head>
<body>
<div id="myCanvas"></div>
</body>
</html>
マウスオンからマウスオフまでは動的にマウスを追尾するように描画し、マウスオフで確定としたいのですが、実装できません。。。
また、IEだと、時折描画できなくなりました。
No.2
- 回答日時:
> また、IEだと、時折描画できなくなりました。
すみませんが、この原因はわかりません。
> マウスオンからマウスオフまでは動的にマウスを追尾するように描画し、マウスオフで確定としたいのですが、実装できません。。。
アルゴリズムだけですが。
onmousedownで開始地点をセットするのは同じですが、
onmousemoveで常に線を描画します。
そのとき、昔の線を残したままだと、線が何重にも書かれてしまうので、
mousemoveの度に直前の線を消して、改めて新しい線を引かなければなりません。
jsgraphics.jsの場合は、指定した線だけを消すことが出来ればいいのですが、
それができなければ、配列に今までどんな線を引いたか覚えておいて、
onmousemoveの度に
全てクリア -> 確定分を全て描画 -> 今回のonmouvemoveの分を描画
と、ちょっと処理に時間がかかるかも知れません。
あとはonmouseupで確定するため、配列にpushです。
マウスボタンを押した後、ブラウザウインドウの外でマウスアップすると、onmouseupイベントが発生しないことがあります。
私の場合は、キャンバス内でmousedown -> キャンバス外でmousedownすると、キャンバスの描画をキャンセル、
キャンバス内でonmousedown -> onmousedownの順番でイベントが発生したら、2回目のmousedownの位置を開始地点に上書きにしました。
頂いたアドバイスを元に以下の様に実現できました。
ありがとうございました。
<html>
<head>
<script type="text/javascript" src="wz_jsgraphics.js"></script>
<script type="text/javascript">
<!--
function getMousePosition(e) {
var obj = new Object();
if(e) {
obj.x = e.pageX;
obj.y = e.pageY;
} else {
obj.x = event.x + document.body.scrollLeft;
obj.y = event.y + document.body.scrollTop;
}
return obj;
}
window.onload = function (){
var fromX;
var fromY;
var toX;
var toY;
var mouseon=0;
var jg = new jsGraphics("myCanvas");
window.document.onmousemove = function(e){
if(mouseon==1){
toX = getMousePosition(e).x;
toY = getMousePosition(e).y;
jg.clear();
jg.setColor("#ff0000");
jg.drawLine(fromX, fromY, toX, toY);
jg.paint();
}
}
window.document.onmousedown = function(e){
jg.clear();
mouseon=1;
fromX = getMousePosition(e).x;
fromY = getMousePosition(e).y;
}
window.document.onmouseup = function(e){
mouseon=0;
toX = getMousePosition(e).x;
toY = getMousePosition(e).y;
var jg2 = new jsGraphics("myCanvas");
jg2.setColor("#000000");
jg2.drawLine(fromX, fromY, toX, toY);
jg2.paint();
}
}
//-->
</script>
</head>
<body>
<div id="myCanvas" ></div>
</body>
</html>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAでの背景画像表示
-
画面のちらつきの原因が知りた...
-
[android]画面に円が表示されな...
-
BMP画像を画像処理して連続に表...
-
変数名の付け方
-
C#において、同じインスタンス...
-
DataGridViewでセルクリックイ...
-
エクセルVBAで、条件に一致する...
-
インスタンス参照でアクセスで...
-
Labelコントロールに数字を代入...
-
関数内の変数に<summary>コメン...
-
生成したインスタンスを削除す...
-
「タイプ初期化子が例外をスロ...
-
Excel VBA 定数にオブジェクト...
-
C# インスタンスの破棄
-
パワーポイントのVBAでテキスト...
-
エクセルVBAにおけるON TIMEメ...
-
return new使用時
-
オブジェクト参照がオブジェク...
-
JTextAreaの大きさの指定と固定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
SwingとEDT(イベントディスパッ...
-
描画してもウィンドウをリサイ...
-
GDI+で描画した画像を消去する...
-
画面のちらつきの原因が知りた...
-
C# リストビューの特定のセルの...
-
C#のGraphicsクラスについてです。
-
重なった要素上でのイベントで...
-
アクセスで他アプリから復帰し...
-
Javaで文字の角度を変えて表示...
-
Canvas等の図形を移動する時,直...
-
canvasで表示されてる画像を1...
-
複数画像表示切り替え Visual c++
-
PictureBoxのDrawWidthの設定
-
C# でパネルのマウスイベントが...
-
描画処理が実行されない
-
JavaScriptについて
おすすめ情報