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-円移動のソース
日本周遊マップ