図形描画サンプル

enchant.jsのサンプルのAndroid版です。
android_canvas_sample.png

アクティビティ(MainActivity.java)

public class MainActivity extends Activity {
  private MyView view;

  @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
     
       view = new MyView(getApplication());
       setContentView(view);
   }
}


ビュー(MyView.java)

public class MyView extends View {
  private Timer timer;
   private Handler handler = new Handler();
   private DisplayMetrics metrics;
   private boolean pause = false;
   private static final int BOXNUM = 150;
   private Circle[] circle = new Circle[BOXNUM];

  // コンストラクタ
   public MyView(Context context) {
       super(context);

      Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
       metrics = new DisplayMetrics();
       display.getMetrics(metrics);

      // 円の作成と初期化
       for (int i = 0; i < BOXNUM; i++) {
           circle[i] = new Circle(metrics);
           circle[i].initCircle();
       }

      // タイマー開始
       timer = new Timer(false);
       startTimer();
   }

  // 描画
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);

      canvas.drawColor(Color.BLACK);    // 背景色

      for (int i = 0; i < BOXNUM; i++) {
           int y = circle[i].moveCircle();
           if (y > metrics.heightPixels) {
               circle[i].initCircle();
           }
           circle[i].drawCircle(canvas);
       }
   }

  // 画面タッチ → 一時停止・再開
   @Override
   public boolean onTouchEvent(MotionEvent event) {
       switch (event.getAction()) {
           case MotionEvent.ACTION_DOWN:
               if (pause) {
                   startTimer();
               }
               else {
                   stopTimer();
               }
               pause = !pause;

              break;
       }
       return true;
   }

  // タイマー開始
   private void startTimer() {
       timer = new Timer(false);
       timer.schedule(new TimerTask() {
           public void run() {
               handler.post(new Runnable() {
                   public void run() {
                       invalidate();
                   }
               });
           }
       }, 0, 50);
   }

  // タイマー停止
   private void stopTimer() {
       timer.cancel();
       timer.purge();
       timer = null;
   }
}


円クラス(Circle.java)

public class Circle extends Paint {
  private int x, y, size, motion;
   private int dispWidth;;

  // コンストラクタ
   public Circle(DisplayMetrics metrics) {
       super();

      setAntiAlias(true);
       setStyle(Paint.Style.FILL);

      dispWidth = metrics.widthPixels;
   }

  // 位置や移動量等の設定
   protected void initCircle() {
       x = (int)(Math.random() * dispWidth) - 1;
       y = 0;
       size = (int)(Math.random() * 10) + 1;
       motion = (int)(Math.random() * 50) + 1;

      int colorR = (int)(Math.random() * 256);
       int colorG = (int)(Math.random() * 256);
       int colorB = (int)(Math.random() * 256);
       setColor(Color.rgb(colorR, colorG, colorB));
   }

  // 描画
   protected void drawCircle(Canvas canvas) {
       canvas.drawCircle(x, y, size, this);
   }

  // 移動
   protected int moveCircle() {
       y += motion;
       return y;
   }
}


参考資料




コメントを投稿するには画像の文字を半角数字で入力してください。


画像認証


  • 最終更新:2013-07-18 15:24:06

このWIKIを編集するにはパスワード入力が必要です

認証パスワード