line と polyline と shape:path による線の描画

フリーハンドツールを作ってるんだけど、線を描画するAPIは3つあり、どれを利用するのが一番いいか調査した。

  • line を利用する
    一番簡単なんだけど、レスポンスが超悪すぎ。フリーハンドツールとしては利用できない
var div_tag = document.getElementById("pointer"); // <div id="pointer"> というタグを作っておく
div_tag.innerHTML += '<v:line style="behavior: url(#default#VML);position:absolute" from="'
                   + prev_x + ',' + prev_y + '" to="'
                   + now_x + ',' + now_y + '" strokecolor="black" />';
  • polyline を利用する
    わりと簡単なんだけど、IEのバグで、画面がビヨーンビヨーンと伸び縮みする時がある
<v:polyline id="l" style="behavior: url(#default#VML);position:absolute;"
            points="0,0" filled="false" strokecolor="black" />

というタグを用意しておいて

var div_tag = document.getElementById("l");
div_tag.points.value += " " + x + "," + y;
  • shape:pathを利用する
    めんどくさいけど、これを利用すべし
<v:shape id="1" filled="false" strokecolor="#000" strokeweight="3px"
    style="behavior:url(#default#VML);visibility:visible;position:absolute;left:0;top:0;width:100;height:100;antialias:false;"
    coordsize="100,100" coordorigin="0, 0" >
  <v:path id="line_path" style="behavior:url(#default#VML);position:absolute" />
</v:shape>

というタグを用意しておいて

var V_PATH_STR_BEG = "m 0,0 l 0,0";
var V_PATH_STR_END = " x e";
var g_position_str = "";
var div_tag = document.getElementById("line_path");
g_position_str += "," + x + "," + y;
div_tag.v = V_PATH_STR_BEG + g_position_str + V_PATH_STR_END;