Androidアプリ作成講座 11-円移動のソース

2018年8月24日

円移動の全ソースを載せます。勢いで作ったので良いソースではありませんが、参考にしてみてください。

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-円移動のソース