AS3を本格的に勉強しはじめて、1年半がたちました。けっこう一人前に書けるようになったつもり。なので汎用的なメソッドを一挙公開。 正しい設計方法を知らないので、我流でこしらえましたが、意外と便利だとおもいます。
つかいかた:
- import する
- ドキュメントクラスでinitしとく
- あとは随時、メソッドを使う
説明:
setObj()
外部の変数やmcやxml、なんでもかんでも場所がわからなくなるから倉庫に保存しとけ!という発想で作りました。とくにstageやroot参照のとき、非常に楽です。
例:
Utils.setObj("myXML",this.basicXML);
getObj()
setObjしたものを呼び出すときに使います。
例:
Utils.getObj("myXML");
init()
stage参照のためのメソッドです。ドキュメントクラスで、あらかじめこんな感じで設定してやる必要があります。
Utils.init(this);
そうすると、あとはこんな感じで簡単にstageを参照できます。ある意味as2的です。
Utils.getObj("root")
detectBrowser()
javascriptを使って、ブラウザ判定をします。といっても、javascript側での設定は必要ありません。html上にあるswfなら、正しく動くはずです。init()したときに、命令してあるので、
trace(Utils.detectedBrowser);
などど書けばストリングとして確認できます。
detectOS()
OSを判定します。MacかWindowsかなど、カスタムしてもよいでしょう。これどっかからパクってきたような気が...忘れてしまいました。
addLink()
mcなどに、リンクを付けるためのメソッド。ターゲットが_blankの場合、ブラウザごとに挙動が違うので、いい感じに開くようになっている(はず)。
例:
Utils.addLink(myMC,"http://www.pokeal.com/","_blank");
getURI()
外部xmlや外部swf、画像などのパスは、絶対パスなら問題ないですが、ローカル作業中に絶対パスにするのも大変です。そこで、swf自身のパスを常に確認できるようにすれば、ローカルであろうが公開されたものであろうが、影響はうけません。
例:swfと同じフォルダにbase.xmlが置いてある場合
var l:URLLoader = new URLLoader();
l.load(new URLRequest(Utils.getURI+ "base.xml"));
truncate()
n文字以降を省略し、「...」などを自動で追加するためのメソッドです。ポイントは半角英数字と日本語とでは、1文字の幅が全然違うので、英数字1に対して日本語を1.7として出力するようにしました。
例:
trace(Utils.truncate("I would like to truncate your word.",15));
trace(Utils.truncate("文字数を省略してみたいのですが。",15));
traceだけではわかりませんが、テキストフィールドで上の両方が同じぐらいの長さで納まっていれば成功です。フォントによって違うので、1.7という値を調整してみてください。
truncateInLines()
truncate()と似ていますが、こっちはテキストフィールドで何行以内におさめるかを調整できます。
例:
Utils.truncateInLines(myTextField,2));
この場合、2行におさめて、入らなかったものは「...」で省略される(はず!)
changeDepth()
mcを最前面、または最背面に移動させます。
例:
Utils.changeDepth(myMC,"Top"));
getChild()
mymc.getChildByName("blah")などとやるのが面倒な場合に使います。(これ使っても面倒ですw)
例:
Utils.getChild(parentMC,"blah")).visible = false;
autoVisible()
指定された子mcを表示し、それ以外の同じ階層の子mcを非表示にします。ユーザによって見せたいものを切り替えるときなどに便利です。
例:
Utils.autoVisivble(parentMC,"childName"));
package {
import flash.display.LoaderInfo;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.events.MouseEvent;
import flash.external.ExternalInterface;
import flash.system.Capabilities;
import flash.net.URLVariables;
import flash.net.navigateToURL;
import flash.net.URLVariables;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.text.TextField;
public class Utils {
public static var Obj:Object = new Object();
public static var detectedBrowser:String="default";
public function Utils() {}
public static function init(o:*):void {
setObj("root",o);
detectBrowser();
}
public static function setObj(n:String,s:*):void {
Obj[n] = new Object();
Obj[n]=s;
}
public static function getObj(n:String):* {
return Obj[n];
}
public static function detectBrowser():void {
if (ExternalInterface.available) {
try {
var userAgent:String=String(ExternalInterface.call("function(){return navigator.userAgent}"));
//Utils.debug(userAgent);
if (userAgent.search("Safari")!=-1) {
detectedBrowser="Safari";
} else if (userAgent.search("MSIE 7.0") != -1) {
detectedBrowser="IE7";
} else if (userAgent.search("Firefox") != -1) {
detectedBrowser="Firefox";
} else if (userAgent.search("MSIE 6.0") != -1) {
detectedBrowser="IE6";
} else if (userAgent.search("Netscape") != -1) {
detectedBrowser="Netscape";
} else if (userAgent.search("Opera") != -1) {
detectedBrowser="Opera";
}
} catch (error:SecurityError) {
}
}
}
public static function detectOS():String {
var capos:String=Capabilities.os;
var os:String = new String();
if (capos.slice(0,3)=="Mac") {
os="Mac";
} else if (capos.slice(0,3) == "Win") {
os="Win";
if (capos=="Windows 98/ME") {
os="OldWin";
}
}
return os;
}
public static function addLink(o:*,url:String,target:String):void {
o.buttonMode=true;
o.addEventListener(MouseEvent.CLICK,onMouseClick);
function onMouseClick(e:MouseEvent):void {
// Should do tricky branch because some browsers block "_blank" window.
switch (detectedBrowser) {
case "Safari" :
openWindowCase1();
break;
case "Firefox" :
openWindowCase1();
break;
case "IE6" :
openWindowCase2();
break;
case "IE7" :
openWindowCase2();
break;
default :
openWindowCase1();
}
function openWindowCase1():void {
navigateToURL(new URLRequest(url),target);
}
function openWindowCase2():void {
ExternalInterface.call("window.open", url, target, "");
}
}
}
public static function getURI():String {
var vars:String=Obj["root"].loaderInfo.url;
var r:RegExp=new RegExp("^(.+\/)","g");
var resultE:Object=r.exec(vars);
return resultE[0];
}
public static function truncate(s:String, limit:Number):String {
var widthByLanguage:uint=0;
for (var i:Number = 0; i < s.length; i++) {
if (s.charCodeAt(i)<=255) {
widthByLanguage+=1;
} else {
widthByLanguage+=1.7;
}
if (widthByLanguage>=limit) {
return s.substr(0, i)+'...';
}
}
return s;
}
public static function truncateInLines(tf:TextField, lines:uint):void {
// TODO : The TextField is visible while this method runs. It should be invisible.
var rawText:String=tf.text;
var suffix:String="...";
var i:uint=0;
while (tf.numLines > lines) {
tf.text=rawText.substr(0,rawText.length-i)+suffix;
i++;
}
}
public static function changeDepth(target:*,type:String):void {
var parentMC:DisplayObjectContainer=target.parent;
//var indexNum:int = parentMC.numChildren;
switch (type) {
case 'Top' :
parentMC.setChildIndex(target, parentMC.numChildren -1);
break;
case 'Bottom' :
parentMC.setChildIndex(target,0);
break;
}
}
public static function getChild(parentMC:MovieClip,s:String):*{
for (var i:int = 0; i< parentMC.numChildren ; i++){
if(parentMC.getChildAt(i).name == s){
return parentMC.getChildAt(i);
}
}
trace("指定された名前のMCなし");
return null;
}
public static function autoVisible(parentMC:MovieClip,s:String):void{
//指定された名前のMC以外を非表示にする!
parentMC.visible = true; //親がみえてないと、さがせないぽい
for (var i:int = 0; i< parentMC.numChildren ; i++){
if(parentMC.getChildAt(i).name == s){
parentMC.getChildAt(i).visible = true;
} else {
parentMC.getChildAt(i).visible = false;
}
}
}
}
}
自分なりに自由に変更してつかってください。
コメントする