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 でどう評価してるか、なあたりがなんとなく分かれば良いのですが、それは別途とゆー事にしてちょい休みます。