ActionScript3 汎用クラス

user-pic
0
AS3を本格的に勉強しはじめて、1年半がたちました。けっこう一人前に書けるようになったつもり。なので汎用的なメソッドを一挙公開。 正しい設計方法を知らないので、我流でこしらえましたが、意外と便利だとおもいます。


 つかいかた:
  1. import する
  2. ドキュメントクラスでinitしとく
  3. あとは随時、メソッドを使う

説明:
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;
}
}
}

}
}




自分なりに自由に変更してつかってください。

トラックバック(0)

トラックバックURL: http://www.pokeal.com/system/mt-tb.cgi/27

コメントする

このブログ記事について

このページは、utabiが2009年6月20日 19:34に書いたブログ記事です。

ひとつ前のブログ記事は「効率的な JavaScript」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。