return s;\r
},\r
\r
+ /*isKeyErrorメソッド\r
+ * 後述のsetKeyメソッドで使われる。keyTimes属性のエラーをチェックするメソッド\r
+ * 属性値にエラーがあれば、trueを返し、なければ、falseを返す*/\r
+ isKeyError: function(/*number*/ keyLength, /*number*/toLength) {\r
+ return !!(keyLength && (keyLength !== (toLength+1)) );\r
+ },\r
+ \r
/*setKeyメソッド\r
* 引数の要素のkeyTimes属性やkeySplines属性を処理するためのメソッド\r
* 必要な他の属性処理はsetValuesメソッドに任せている*/\r
this.getAttr("from", null),\r
this.getAttr("to", null),\r
this.getAttr("by", null) ),\r
+ toLength = to ? to.length : 0,\r
keyTimes = this.getAttr("keyTimes", null),\r
keySplines = this.getAttr("keySplines", null),\r
keys,\r
return null;\r
}\r
/*toオブジェクトはtoとfromで一組となっているのでlengthが加算される*/\r
- if (keys.length && (keys.length !== (to.length+1))) {\r
+ if (this.isKeyError(keys.length, toLength)) {\r
/*keyTimes属性とvalues属性のリストの個数が合致しない場合、アニメーションの効果がない\r
* 仕様を参照 SMIL Animation 3.2.3. Animation function calculation modes\r
* http://www.w3.org/TR/smil-animation/#AnimFuncCalcMode*/\r
+ \r
+ /*ただし、animateMotion要素においては、keyPoints属性が\r
+ * values属性のリストよりも優先されるため、\r
+ * keyPoints属性があるときは、アニメーションの効果がある\r
+ * \r
+ * >Regarding determining the points which correspond to the ‘keyTimes’ attributes, the ‘keyPoints’ attribute overrides ‘path’, which overrides ‘values’\r
+ * \r
+ * http://www.w3.org/TR/SVG11/animate.html#AnimateMotionElement\r
+ */\r
return null;\r
}\r
- for (var i=0;i<to.length;++i) {\r
+ for (var i=0;i<toLength;++i) {\r
to[i].keyTime = keys[i+1] - keys[i];\r
if (splines) {\r
toiKeySplines = this.$from.numList.call( {\r
}\r
}\r
} else if (!isDiscrete && to) {\r
- var per = 1 / to.length;\r
- for (var i=0;i<to.length;++i) {\r
+ var per = 1 / toLength;\r
+ for (var i=0;i<toLength;++i) {\r
to[i].keyTime = per;\r
if (splines) {\r
toiKeySplines = this.$from.numList.call( {\r
if (keys.length && (keys[0] !== 0)) {\r
return null;\r
}\r
- if (keys.length && (keys.length !== (to.length+1))) {\r
+ if (this.isKeyError(keys.length, toLength)) {\r
return null;\r
}\r
- for (var i=0;i<to.length;++i) {\r
+ for (var i=0;i<toLength;++i) {\r
to[i].keyTime = keys[i+1] - keys[i];\r
}\r
} else {\r
- var per = 1 / (to.length+1);\r
- for (var i=0;i<to.length;++i) {\r
+ var per = 1 / (toLength+1);\r
+ for (var i=0;i<toLength;++i) {\r
to[i].keyTime = per;\r
}\r
}\r
/*toオブジェクトが足らないので、一つ追加しておく*/\r
- to.push( to[to.length-1].up().mix( function(){\r
+ to.push( to[toLength-1].up().mix( function(){\r
if (!keys) {\r
return;\r
}\r
\r
\r
/*後述のinitializeメソッドで使う要素リスト\r
- * getElementsByTagNameNSã\83¡ã\82½ã\83\83ã\83\89ã\81®è¿\94ã\82\8aå\80¤ã\81®å\85¥å\8a\9bを想定*/\r
+ * getElementsByTagNameNSã\83¡ã\82½ã\83\83ã\83\89ã\81®è¿\94ã\82\8aå\80¤ã\82\92Arrayå\8c\96ã\81\97ã\81\9fã\81\93ã\81¨を想定*/\r
elementList: [],\r
\r
/*何番目からelementListを処理しているかの数値*/\r
- nubmerOfelemList: 0,\r
+ numberOfElemList: 0,\r
\r
/*initialize メソッド\r
* 要素リストを初期化させる\r
if (!eles || !eles.length) {\r
return;\r
}\r
- var length = this.nubmerOfelemList+30;\r
- for (var i=0; i<eles.length; ++i) {\r
- this.up().init(eles.item(i));\r
+ var length = this.numberOfElemList+50;\r
+ for (var i=length-50; i<length; ++i) {\r
+ if (eles.length <= i) {\r
+ this.elementList = null;\r
+ return;\r
+ }\r
+ this.up().init(eles[i]);\r
}\r
- this.nubmerOfelemList += 30;\r
+ this.numberOfElemList += 50;\r
eles = length = void 0;\r
},\r
\r
to = this.setKey(ele);\r
}\r
if (to) {\r
- this.funcs = to.map( function(x) {\r
+ var aa = new Array(to.length);\r
+ for (var i=0;i<to.length;++i) {\r
+ var x = to[i];\r
x.to.string = toRGB(x.to.string);\r
x.to.from.string = toRGB(x.to.from.string);\r
var s = x.call();\r
* endKeyTimeプロパティは区間のエンド地点*/\r
s.startKeyTime = keyTime;\r
keyTime = s.endKeyTime = keyTime + x.keyTime;\r
- return s;\r
- } )\r
- .filter( function(s) {\r
+ aa[i] = s;\r
+ }\r
+ this.funcs = aa.filter( function(s) {\r
if (!this.timeline.isResolved) {\r
/*begin属性などにイベントを設定していた(未解決の)場合、後のs(0.1)がうまく作動せず、\r
* 例外を出してしまうため、ここで返しておく*/\r
this.setAdd(ele, to);\r
this.setAccum(ele, to);\r
}\r
- keywords = toRGB = isColor = void 0;\r
+ keyTime = keywords = toRGB = isColor = void 0;\r
} )\r
/*$animateTranformElementオブジェクト\r
* animateTransform要素に関連するオブジェクト*/\r
mode: "paced",\r
\r
/*hasAttrValuesメソッドのオーバライド\r
- * path属性に対応させるため*/\r
+ * pathå±\9eæ\80§ã\81ªã\81©ã\81«å¯¾å¿\9cã\81\95ã\81\9bã\82\8bã\81\9fã\82\81*/\r
hasAttrValues: function () {\r
if (this.$attribute.hasAttrValues.call(this)) {\r
return true;\r
rotate = +this.rotate;\r
}\r
return point.x+ "," +point.y + this.getRotate(path, advanceLength, rotate);\r
+ },\r
+ \r
+ /*setValuesメソッドのオーバライド*/\r
+ setValues: function() {\r
+ if (this.getAttr("keyPoints", null)) {}\r
+ return this.$setElement.setValues.apply(this, arguments);\r
}\r
} )\r
.on("init", function (ele) {\r
});\r
function init (obj, name) {\r
/*あとでframe.initializeメソッドで呼び出すために準備しておく*/\r
- obj.elementList = svgDoc.getElementsByTagNameNS(svgns, name);\r
- if (obj.elementList.length) {\r
+ var elist = svgDoc.getElementsByTagNameNS(svgns, name);\r
+ obj.numberOfElemList = 0;\r
+ if (elist.length > 0) {\r
+ obj.elementList = elist;\r
frame.objList.push(obj);\r
}\r
- eles = obj = void 0;\r
+ elist = obj = void 0;\r
};\r
- frame.initialize();\r
};\r
}\r
\r
if (!this.isPaused) {\r
frame++;\r
try {\r
+ this.initialize();\r
this.setFrame(frame);\r
} catch(e) {\r
}\r