RaphaelJS でペイント アプリケーションを開始しています。(マウスで)紙に描かれたすべての要素を追跡する最良の方法は何ですか?
私が考えた最初の方法は、描画されたすべての要素を配列に追加することでしたが、RaphaelJS に「すぐに使える」ソリューションがある場合、これはそれほど効率的ではない可能性があります。
APIを確認しましたが、探していたようなものが見つかりませんでした...運が悪いのでしょうか?
RaphaelJS でペイント アプリケーションを開始しています。(マウスで)紙に描かれたすべての要素を追跡する最良の方法は何ですか?
私が考えた最初の方法は、描画されたすべての要素を配列に追加することでしたが、RaphaelJS に「すぐに使える」ソリューションがある場合、これはそれほど効率的ではない可能性があります。
APIを確認しましたが、探していたようなものが見つかりませんでした...運が悪いのでしょうか?
「追跡」という言葉の意味にもよると思います。
を使用して特定の紙のすべての要素をループすることができ、 をPaper.forEach
使用して特定の要素を引き出すことができますPaper.getById
。
で要素を描画している場合は、この SO スレッドPaper.path
で説明されている方法を使用して、別のデータ構造に格納できる ID を設定します。
私は Raphael.js に少し取り組みましたが、私が見つけた最も効率的な方法は、描画ロジックをデータ構造から分離することでした。ここにコードを完全に記述することはできません (長すぎる =( ) が、コード片を使用していくつかのアイデアを提供できます。
// Create Data Structure to keep seperate track of Elements and its attribute (assuming a Drawing Panel and only Line Type here)
function DrawingPanelStructure(Type, Attributes){
this.Type = Type;
this.Attributes = Attributes;
}
function PanelLineAttribute(Color,CurveDataX, CurveDataY)
{
this.Color = Color;
this.CurveDataX = CurveDataX;
this.CurveDataY = CurveDataY;
}
// Make Global Variables
_drawingPanelStructure = new Object();
var ElementDrawnNumber = 0; // Keeping Track of Number of elements drawn
// Then when Drawing the element, populate the Data Structure inside a function as
_drawingPanelStructure[ElementDrawnNumber] = new DrawingPanelStructure("Line",new PanelLineAttribute("Red",[1,5,6,7,5], [5,1,8,6,8]));
ElementDrawnNumber = ElementDrawnNumber + 1;
// Then you can call a function to draw the Element at specific index as
var XData = [];
var YData =[];
XData.push(_drawingPanelStructure[index].Attributes.CurveDataX);
YData.push(_drawingPanelStructure[index].Attributes.CurveDataY);
var LineChart = Paper.linechart(0, 0, DrawinPanelWidth, DrawingPanelHeight, 0),
XData, YData, {}
);
// Since in this example there is only 1 line drawn on LineChart I'll use LineChart.lines[0]
LineChart.lines[0].attr({ "stroke": _drawingPanelStructure[index].Attributes.Color});
また、要素の描画中に一意のIDを指定できるという点でも役立ちます
ElementDrawn.id = "Element_" + ElementDrawnNumber;
そうすれば、Element_3 が _drawingPanelStructure の 3 番目のインデックスにある要素を意味することが確実になります。
したがって、描画ロジックをデータ構造から分離します。つまり、データ構造にデータを入力し、データ構造を何らかの関数に渡し、パネル上のすべての描画を行います。
私の経験から、最も効果的なアプローチは、各図面のモデルを配列に保持する特殊なオブジェクト (DataManager と呼びましょう) を作成することです (実際の Rapahel オブジェクトではありません)。
ここにマネージャーのスタブがあります:
function DataManager (){
var self = this;
self.DrawingsArray = [];
}
モデルスタブは次のとおりです。
function DrawingModel (name,raphael){
var self = this;
self.ID = someObject.generateSomeID();
self.Name = name;
self.Rapahel = raphael;
}
これを念頭に置いてモデルを作成し、図面をワークスペースに追加した後、それに raphael オブジェクトの参照を追加し、名前または ID を付けてから、DataManager の DrawingArray に追加します。id に関しては、Raphael オブジェクトに新しいプロパティとして追加することもできるため、イベント ハンドラーでモデルに簡単にアクセスできます。
主な利点は次のとおりです。