CLiCkin2DaBeaT
色々気になる部分を掘ってみます。
VideoView あたり
C2B な Activity は
- VideoView
- GameView
が FrameLayout で重ねて表示されているはず。とりあえず最初に add される VideoView 関連の処理から確認。
- resetGame メソドでオブジェクト生成
- onPrepared、onError、onCompletion なリスナ設定
- runC2B メソドで setVideoURI される
- displayCreateLevelInfo でも setVideoURI されてます
- これは displayCreateLevelAlert で生成されて show される AlertDialog の Positive なボタンクリック時に busyProcessing が false の場合な模様
- onCompletion からも呼び出されている模様
ええと、例えば runC2B 経由で setVideoURI された時点で準備完了って事で onPrepared なコールバックが呼ばれる、という理解で良いのかな。
あ、思い出した。Video の開始と GameView なソレをどうやって同期してるのか、が分からないんだった。ぱらっと見では C2B でそのあたりの処理をしているようには見えんな。
GameView
こちらも謎が多い。コンストラクタで Thread が kickoff されて動きっぱなし。ただ、C2B 側で resetGame メソド (GameView のオブジェクト生成してます) な呼び出しがあるので都度、なのかどうか。
逆に言えば VideoView は setVideoURI される所がトリガになってる、という事が分かり易いとも言えますな。うーん。
あと、C2B 側で読み込まれた xml なナニが格納されている targets という属性なのですが、C2B 内では然程積極的に使われていないみたいで、あら? と思ったら public な属性になっている模様。
GameView ではコンストラクタで以下の事してて
public GameView(Context context) { super(context); parent = (C2B) context;
C2B なオブジェクトへの参照は確保している模様。これによって再生時間 (?) も同期は取れるみたい。C2B の以下なメソドが public で定義されてます。
public int getCurrentTime() { try { return background.getCurrentPosition(); } catch (IllegalStateException e) { // This will be thrown if the player is exiting mid-game and the video // view is going away at the same time as the foreground is trying to get // the position. This error can be safely ignored without doing anything. e.printStackTrace(); return 0; } }
VideoView#getCurrentPosition() は内部的に保持してる MediaPlayer#getCurrentPosition() を戻しているらしい。
ちょい休む
てか、VideoView 側と同期が取れるんだったら、GameView 側は Thread を kickoff して行ってらっしゃい、で大丈夫なのか。
あとは GameView#onTouchEvent でどう評価してるか、なあたりがなんとなく分かれば良いのですが、それは別途とゆー事にしてちょい休みます。