Androidアプリ作成講座 11-円移動のソース
円移動の全ソースを載せます。勢いで作ったので良いソースではありませんが、参考にしてみてください。
1.MainActivity
package kunimiyasoft.circletest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { private MySurfaceView myView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView = new MySurfaceView(this) ; setContentView(myView); } }
2.MySurfaceView
package kunimiyasoft.circletest; import android.content.Context; import android.content.res.Configuration; import android.graphics.PorterDuff; import android.view.Surface; import android.view.SurfaceView; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Color; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; private CircleAnimation circleAnimation ; // アニメーションクラス // 画面サイズ private int screenWidth ; private int screenHeight ; // 円の位置 private int circle_x ; private int circle_y ; private int radius ; // 向きが変わったか? private int isOrientation = -1 ; public MySurfaceView(Context context) { super(context); // アニメーションクラスのインスタンス作成 circleAnimation = new CircleAnimation(this) ; holder = getHolder(); holder.addCallback(this); } // 変化があった時 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { int radius ; screenWidth = width ; screenHeight = height ; // 向きが変わった時のみ描画するようにする int orientation = getResources().getConfiguration().orientation; if (orientation != isOrientation) { // 向きが変わった時 circleAnimation.SetValue(width, height) ; circleAnimation.setDuration((long)circleAnimation.GetMoveTime()) ; this.startAnimation(circleAnimation); } isOrientation = orientation ; } // 作成された時 @Override public void surfaceCreated(SurfaceHolder holder) { } // 破棄される時 @Override public void surfaceDestroyed(SurfaceHolder holder) { } // 円の位置をセットする public void SetCircleX(int x) { circle_x = x ; } public void SetCircleY(int y) { circle_y = y ; } public void SetRadius(int r) { radius = r ; } public void myDraw() { Canvas canvas = holder.lockCanvas(); Paint paint = new Paint(); // 白で塗りつぶす paint.setStyle(Paint.Style.FILL); // 塗りつぶし paint.setColor(Color.WHITE); canvas.drawRect(0, 0, screenWidth, screenHeight, paint); // 円の描画 paint.setStyle(Paint.Style.STROKE); // 塗りつぶし無し paint.setStrokeWidth(5) ; paint.setColor(Color.argb(255, 0, 0, 0)); canvas.drawCircle(circle_x, circle_y, radius, paint); // ブラシを元に戻す paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.FILL); // 塗りつぶし holder.unlockCanvasAndPost(canvas); } }
3.CircleAnimation
package kunimiyasoft.circletest; import android.view.animation.Animation; import android.view.animation.Transformation; public class CircleAnimation extends Animation { private MySurfaceView myView_ins ; // 画面サイズ private int screenWidth ; private int screenHeight ; private int radius ; private static int movetime = 10000 ; // 開始から終了までの時間 // コンストラクタ public CircleAnimation(MySurfaceView myView) { myView_ins = myView ; } // 初期値設定 public void SetValue(int width, int height) { screenWidth = width ; screenHeight = height ; // 円の半径と座標の位置を計算する if (width < height) { radius = width / 4 ; } else { radius = height / 4 ; } } // 移動時間の取得 public int GetMoveTime() { return movetime ; } // 描画処理 @Override protected void applyTransformation(float interpolatedTime, Transformation transformation) { int circle_x = screenWidth / 2 ; int circle_y = radius ; int move_y = screenHeight - 2 * radius ; // 現在位置の割り出し int workpos_x = circle_x ; // X座標は移動しない int workpos_y = circle_y + (int)((float)move_y * interpolatedTime) ; myView_ins.SetCircleX(workpos_x) ; myView_ins.SetCircleY(workpos_y) ; myView_ins.SetRadius(radius) ; myView_ins.myDraw(); // SurfaceViewの描画関数を呼び出す } }
(LIST)Androidアプリ作成講座
Androidアプリ作成講座 プロローグ
Androidアプリ作成講座 1-プロジェクトを作る
Androidアプリ作成講座 2-プロジェクトを確認する
Androidアプリ作成講座 3-エミュレーター環境を作る
Androidアプリ作成講座 4-SurfaceViewクラスを作成する
Androidアプリ作成講座 5-SurfaceViewをActivityにセットする
Androidアプリ作成講座 6-SurfaceViewがイベントを受け取れるようにする
Androidアプリ作成講座 7-キャンバス上で描画する
Androidアプリ作成講座 8-円を描画する
Androidアプリ作成講座 9-デバッガを使ってみよう
Androidアプリ作成講座 10-Animationクラスを使う
Androidアプリ作成講座 11-円移動のソース