iPhoneSDKのサンプルMoveMeをAndroidに移植

iPhoneSDKのサンプルMoveMeをAndroidに移植してみた。ソースはこちら

左がオリジナル(iPhone版)、右が移植したもの。

(ならべて見ると・・・大きさが違い過ぎだが・・・気にしない・・・ )

MoveMeというプログラムは、次のような簡単なプログラムである。

  • 最初に画面中央にメッセージ(短い挨拶文)が書かれたボタンが表示される。
  • ボタンをタッチすると少し膨らみ、ボタンの中心はタッチされた位置に移動する。
  • ボタンはドラッグして移動され、指を離すと中央に戻る。中央に戻ったとき、勢いでボタンがはねるような動きをする。
  • ボタン以外の部分をダブルクリックすると、メッセージの言語が変わる。

Viewの構成

iPhone版ではメインの親であるMoveMeView上のタッチされた位置に、子であるPlacardView(ボタン)を表示する。PlacardViewは親画面内の座標で位置指定される。Androidで小画面(コントロールも含む)の位置指定はLayoutManagerに依存する。LayoutManagerもViewを継承するので、これが親画面といえる。座標で位置指定するにはLayoutManagerとしてAbsoluteLayoutを使用する必要があるが、実はこのAbsoluteLayoutの使用は推奨されていない。これはAndroid(だけでなく一般的なJavaプログラムにもいえることだが)ではデバイスにより画面サイズが異なるため、位置を座標で指定すると画面からはみ出たり、逆に小さ過ぎたりする可能性があるため。一般にLayoutManagerは親画面に対する小画面の相対位置を指定し、デバイスの画面サイズにあわせて、小画面やコントロールを自動的に最適な場所に配置する。ただしこのプログラムでは、小画面は画面のタッチで位置指定されるので、画面サイズの影響を気にする必要はなく、AbsoluteLayoutでも問題なかった。

クラスの構成

iPhone版で定義されたClassと、Android版のClassの対応は以下のようになった。

  • MoveMeAppDelegate → なし(Delegateの仕組みがない)
  • MoveMeView(メインの画面) → MoveMe内で使用されるAbsoluteLayoutクラス。
  • PlacardView(ボタン) → PlacardView

Animationの使用

ボタンを最初にクリックした際にボタンがふくらむ動作と、ドラッグされたボタンから指を離すと中心に戻り、反動で少し揺れる動作はアニメーションを使用した。SDKのサンプルではXMLファイルで定義するアニメーションの例が多いが、今回はアニメーションの位置が動的に変わるため、XMLだけでなく、プログラムによる定義も使用した。

↓↓↓Animation定義のコード↓↓↓

	//animate moving to center
	final long DURATION_ANIM1 = 300;
	TranslateAnimation move_center = new TranslateAnimation(
			TranslateAnimation.ABSOLUTE, x - mCenter.x,
			TranslateAnimation.RELATIVE_TO_SELF, 0,
			TranslateAnimation.ABSOLUTE, y - mCenter.y,
			TranslateAnimation.RELATIVE_TO_SELF, 0);
	move_center.setDuration(DURATION_ANIM1);
	move_center.setStartTime(Animation.START_ON_FIRST_FRAME);
	move_center.setInterpolator(new LinearInterpolator());
	//animate bouncing
	TranslateAnimation bounce = new TranslateAnimation(
			(float)0,
			(float)(mCenter.x - (mPtEnd.x + WIDTH/2))/20,
			(float)0,
			(float)(mCenter.y - (mPtEnd.y + HEIGHT/2))/20);
	bounce.setDuration(200);
	bounce.setStartTime(Animation.START_ON_FIRST_FRAME);
	bounce.setStartOffset(DURATION_ANIM1);
	bounce.setInterpolator(new CycleInterpolator((float) 2.75));
	//AnimationSet consist of above two animation
	AnimationSet go_center_bounce = new AnimationSet(false);
	go_center_bounce.addAnimation(move_center);
	go_center_bounce.addAnimation(bounce);
	this.setAnimation(go_center_bounce);
	go_center_bounce.startNow();

イベントハンドラ

iPhone版では親画面であるMoveMeViewにイベントハンドラが定義されているが、Android版では、親画面となるAbsoluteLayoutにListenerを追加し、そのListener内にイベントハンドラを定義することになる。1つよくわからないのが、ダブルクリックの判定方法で、今回は前回クリックされてから何ms以内に次のクリックがあればダブルクリックと判定している。あまりスマートでない感じがするので、もっといい判定方法を調べなければ。

AbsoluteLayoutによるボタンの位置指定

AbsoluteLayoutのLayoutParamsが位置の属性を持つ。ということは、このLayoutParamsの参照を保持しておき、属性を変更することで位置を変更できるかと思いきや、位置を指定するたびにAbsoluteLayoutのsetLayoutParams()を呼び出す必要があった。

まとめ

今回のサンプルは非常に簡単だったので、アニメーションの使用を除けば、一般的なJavaプログラムとそれほど変わらず、Androidだからということで特別に意識するところはなかった。Javaが使えるので、iPhoneよりは敷居が低そうだ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください