Category : Actionscript3.0
Progression4 × gaforflash
progression4でGoogle Analytics for Flashを使ってみる
ちょっと使う機会があったのでメモ。
一応、ちゃんと取得出来ているので良しとしておこう。。。
// IndexScene.as
package
{
import com.flashdynamix.utils.SWFProfiler;
import com.google.analytics.GATracker;
public class IndexScene extends SceneObject
{
private var _tracker:GATracker;
private var _swfPath:String;
public function IndexScene( name:String = null, initObject:Object = null )
{
// google analytics
_tracker = new GATracker( container, "UA-xxxxxxxx-x", "AS3", false );
manager.addEventListener( ProcessEvent.PROCESS_COMPLETE, onProcessComplete );
// localhost じゃない場合は swf のパスを取得
if ( _tracker.config.domainName != "localhost" )
{
var _array:Array = manager.stage.loaderInfo.url.split( "/" );
_swfPath = ( ( _array.length > 4 ) ? "/" : "" ) + _array.slice( 3, _array.length - 1 ).join( "/" ) + "/";
}
}
// PROCESS_COMPLETE
private function onProcessComplete( e:ProcessEvent ):void
{
if ( _swfPath )
{
// google analytics
var _pathArray:Array = e.targetScene.sceneId.path.split( "/" );
_tracker.trackPageview( _swfPath + _pathArray.slice( 2, _pathArray.length ).join( "/" ) );
}
}
}
}
■コンストラクタで GATracker を生成して、 イベントリスナーを登録する。(16、17行目)
GATracker の第1引数に DisplayObject を指定し、第2引数に Google Analytics のIDを指定。
第3引数に mode を指定(今回は “AS3″)、第4引数はデバッグの ON/OFF。
第5引数以降はまたの機会に。。。
シーンの遷移後にトラッキングを実行したいのでイベントタイプは ProcessEvent.PROCESS_COMPLETE。
■シーン遷移時にトラッキングを実行(34行目)
_tracker.trackPageview(“/hogehoge”); でトラッキングを実行。
■参考サイト
> Google Analytics Tracking for Adobe Flash 関連ドキュメントの日本語訳
それにしても、やっぱり便利すぎるProgression。
for-each-in / for-in
for-each-inとfor-inの違い
意外と知らなかった・・・。
package
{
import flash.display.Sprite;
public class ForTest extends Sprite
{
private var _obj:Object;
public function ForTest()
{
_obj = {};
_obj.city = "Tokyo";
_obj.country = "Japan";
for each ( var o:* in _obj )
{
trace( o );
}
/*
* 出力結果:値を出力
* Tokyo
* Japan
*/
for ( var p:* in _obj )
{
trace( p );
}
/*
* 出力結果:変数名を出力
* city
* country
*/
for ( var q:* in _obj )
{
trace( _obj[q] );
}
/*
* 出力結果:値を出力
* Tokyo
* Japan
*/
}
}
}
try / catch
例外のバブリング
例外がthorwされた場合のバブリングについて。
■tryブロック内でthrowされた場合
try
{
throw new Error( "error" );
}
catch( e:Error )
{
// 問題の処理
}
throwされた値のデータ型(上記の場合はError型)に一致するパラメータのデータ型を持つcatchブロックを探す。
■catchブロックが見つからない、もしくは、tryブロック外でthrowされた場合
// ProblemClass.as
package
{
public class ProblemClass
{
public function ProblemClass()
{
}
public function doSomething():void
{
throw new Error( "エラー" );
}
}
}
// NormalClass.as
package
{
public class NormalClass
{
public function NormalClass()
{
var _problem:ProblemClass = new ProblemClass();
_problem.doSomething();
}
}
}
// ErrorTest.as
package
{
import flash.display.Sprite;
public class ErrorTest extends Sprite
{
public function ErrorTest()
{
try
{
var _normal:NormalClass = new NormalClass();
}
catch( e:Error )
{
trace( "例外はErrorTest内でキャッチされました" );
// 問題の処理
}
}
}
}
Actionscriptは一致するcatchブロックを持ったtryブロックを、コールスタック全体の下から上に検索する。
上記の例は例外をthrowするメソッドを呼び出したメソッドの呼び出し元がtryブロックに囲まれているので、例外をthrowするメソッドがコールスタックの2階層上でキャッチされる。
■適したcatchブロックがない場合
例外に適したcatchブロックがコールスタックのどこにも見つからない場合、Actionscriptはその時点でコールスタックに残っている全てのコードの実行をやめる。
デバッグ版の場合は、エラーが出力される。
sharedEvents
異なるドメイン間でのイベントの共有
異なるドメイン間の2つの.swfファイルで、allowDomain()を使用せずにイベントを共有する方法。
LoaderInfoクラスのインスタンス変数のsharedEventsを使用する。
ある特定のイベントに関して、sharedEventsを通して、イベントを転送する。
■index.swf(読み込む側)
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
public class index extends Sprite
{
private var _loader:Loader;
public function index()
{
// .swfのロード
_loader = new Loader();
_loader.load( new URLRequest( "http://hoge.com/child.swf" ) );
addChild( _loader );
// Event.MOUSE_LEAVEイベントに関する登録
stage.addEventListener( Event.MOUSE_LEAVE, onMouseLeave );
}
// イベントリスナー
private function onMouseLeave( e:Event ):void
{
// child.swfに転送
_loader.contentLoaderInfo.sharedEvents.dispatchEvent( e );
}
}
}
■child.swf(読み込まれる側)
package
{
import flash.display.Sprite;
import flash.events.Event;
public class child extends Sprite
{
public function child()
{
// Event.MOUSE_LEAVEイベントに関する登録
loaderInfo.sharedEvents.addEventListener( Event.MOUSE_LEAVE, onMouseLeave );
}
// sharedEventsをターゲットにした、イベントリスナー
private function onMouseLeave( e:Event ):void
{
trace( "child.onMouseLeave()が呼び出されました。" );
}
}
}