[PR] この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

Androidプログラミング日記 (仮)  

バウンディングボックス

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

share
 

 

 

さあ、きましたよ

以前にわたしは「バウンディングボックスが作成できたら、自分の中の初心者脱出」みたいなことをいっていました。そしてついに今回バウンディングボックスを作ってみます。新しいメソッドが1つと、あとは今までやってきたものを無理やり取り入れて作ってみました。お楽しみに!

スレッド処理

Viewを利用した画面などを更新をあまりしないでいいもの、たとえば作成した15パズルや、業務データアプリなどは何かのタイミングで任意に画面などを更新すればいいですよね。しかし画像の移動などを使うゲームやリアルタイムチャットなどは一定の間隔で更新しなければいけません。そのためのSurfaceViewと呼ばれるメソッドが用意されています。それがスレッド処理と呼ばれるものです。わたしのイメージ的にはViewを使った処理では、10個画像があったら1つずつ画像を作成して1つずつ画像を表示していきますが、SurfaceViewでは10個作成して表示を一度の処理でやるイメージでしょうか。

おためしで

SurfaceViewを使ったプログラミングを組むにあたり、もっと効率的なやり方があると思うのですが、その勉強をする前にわたしはがまんができなくなり無理やり使用して作成することにしました。なので今回はSurfaceViewの紹介くらいに思っておいて下さい。

今回作成使用したファイルは3つです。

 

ファイル名「SerfaceViewActivity.java」

01package and.roid;
02 
03import android.app.Activity;
04import android.os.Bundle;
05import android.graphics.*;
06import android.view.*;
07 
08public class SerfaceViewActivity extends Activity {
09/** Called when the activity is first created. */
10@Override
11public void onCreate(Bundle savedInstanceState) {
12super.onCreate(savedInstanceState);
13requestWindowFeature(Window.FEATURE_NO_TITLE);
14getWindow().setFormat(PixelFormat.TRANSLUCENT);
15setContentView(new SurfaceViewView(this));
16}
17}
 
 

ファイル名「SurfaceViewView.java」

01package and.roid;
02 
03import android.content.Context;
04import android.view.SurfaceHolder;
05import android.view.SurfaceView;
06import android.graphics.*;
07import android.view.*;
08 
09public class SurfaceViewView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
10public static final int BOXKAZU = 10; //ボックスの最大数
11public static final int BOXBIG = 100; //ボックスの最大大きさ
12public static final int BOXMIN = 10; //ボックスの最小の大きさ
13public static final int MAXBOXVXY = 20; //ボックスの最大移動量
14public static final int MINBOXVXY = 5; //ボックスの最小移動量
15private SurfaceHolder holder;
16private Thread thread;
17 
18private boolean start=false; //最初の1つのボックスが作成されているかどうか
19private int box=0; //作成したボックスの数
20private RectBox[] rect = new RectBox[BOXKAZU];
21 
22//コンストラクタ
23public SurfaceViewView(Context context) {
24super(context);
25// TODO 自動生成されたコンストラクター・スタブ
26holder = getHolder();
27holder.addCallback(this);
28holder.setFixedSize(getWidth(), getHeight());
29}
30 
31public void run() {
32// TODO 自動生成されたメソッド・スタブ
33Canvas canvas;
34Paint p = new Paint();
35p.setAntiAlias(true);
36 
37while(thread != null){
38canvas = holder.lockCanvas();
39canvas.drawColor(Color.WHITE);
40p.setTextSize(30);
41p.setColor(Color.BLACK);
42if(start==true){
43for(int i=0;i<box;i++){
44rect[i].DrawBox(canvas, p);
45rect[i].move();
46}
47}
48 
49holder.unlockCanvasAndPost(canvas);
50 
51try {
52Thread.sleep(50);
53} catch (Exception e){}
54}
55 
56}
57 
58public void surfaceChanged(SurfaceHolder holder, int format, int width,
59int height) {
60// TODO 自動生成されたメソッド・スタブ
61 
62}
63 
64public void surfaceCreated(SurfaceHolder holder) {
65// TODO 自動生成されたメソッド・スタブ
66thread = new Thread(this);
67thread.start();
68}
69 
70public void surfaceDestroyed(SurfaceHolder holder) {
71// TODO 自動生成されたメソッド・スタブ
72thread = null;
73 
74}
75 
76public boolean onTouchEvent(MotionEvent event){
77int action = event.getAction();
78int x = (int)event.getX();
79int y = (int)event.getY();
80switch(action){
81case MotionEvent.ACTION_DOWN:
82break;
83case MotionEvent.ACTION_UP:
84if(box<BOXKAZU && x<getWidth()-BOXBIG && y<getHeight()-BOXBIG){
85start=true;
86rect[box] = new RectBox();
87rect[box].init(x,y,BOXBIG,BOXMIN,MAXBOXVXY,MINBOXVXY,getWidth(), getHeight());
88box++;
89}
90break;
91}
92return true;
93}
94 
95}
 
 

ファイル名「RectBox.java」

01package and.roid;
02 
03import java.util.Date;
04import java.util.Random;
05 
06import android.graphics.Canvas;
07import android.graphics.Color;
08import android.graphics.Paint;
09import android.graphics.Rect;
10 
11public class RectBox {
12private int px,py; //ボックの座標
13private int vx,vy; //ボックスの移動量
14private int col; //カラー
15private int bxy; //ボックスの大きさ
16private int gw,gh; //画面の大きさ
17 
18//コンストラクタ
19RectBox(){
20super();
21}
22 
23//初期化
24public void init(int x, int y, int b,int m, int maxvxy, int minvxy, int ww, int wh){
25Random r = new Random(new Date().getTime());
26gw = ww;
27gh = wh;
28px = x;
29py = y;
30vx = r.nextInt(maxvxy-minvxy)+minvxy;
31if(r.nextInt(100)>50) vx *= -1;
32vy = r.nextInt(maxvxy-minvxy)+minvxy;
33if(r.nextInt(100)>50) vy *= -1;
34col = Color.rgb(r.nextInt(240)+10, r.nextInt(240)+10, r.nextInt(240)+10);
35bxy = r.nextInt(b-m)+m;
36}
37 
38//ボックス表示
39public void DrawBox(Canvas c, Paint p){
40p.setStyle(Paint.Style.FILL);
41p.setColor(col);
42c.drawRect(new Rect(px,py,px+bxy,py+bxy), p);
43}
44 
45//ボックス移動
46public void move(){
47if(px<0 || gw<px+bxy) vx =- vx;
48if(py<0 || gh<py+bxy) vy =- vy;
49px += vx;
50py += vy;
51}
52 
53}
 
   

 

このプログラムの説明

画面をタッチして話すとボックスが生成され移動します。画面端にくると反射してまた移動を繰り返します。

タッチできる範囲は画面右、画面下の範囲からボックスの最大大きさで設定した分をマイナスした範囲(100とすると座標0,0から座標380、754)内がタッチ可能範囲となります。これはその範囲外でタッチした時に、ボックスの大きさが画面外に出てしまうのを避けるためです。

Surfaceメソッドで自動生成されるメソッドがあったりでちょっと長くなっていますが、runメソッドに中に処理を書きtry{}catchでしめる感じでしょうか。

プログラムの流れは、SurfaceViewViewが呼び出された時に、runが呼び出され内容が処理されていくかんじです。

最初はボックスは生成されず、タッチし、離した時に配列設定しているRectBoxクラスが生成されます。

RectBoxが呼び出された時のコンストラクタでボックスの値を初期化してもよかったのですが、初期化処理initと分けました。

初期化はタッチした位置でボックス生成、移動量は設定範囲でランダム。if文でのマイナスの設定は、動き出しの方向を決める設定で、100のうち50より大きければマイナス。というふうに二分の一の確率でマイナスに設定。カラーはRGBのそれぞれを255の中をランダムで設定。すべて0だと白になりそれでは見えないので10以上になるように設定。最後にボックスの大きさも設定されたランダムで設定このクラスには3つのメソッドがあり、初期化、表示、移動の3つだけの簡単なものです。

全然たいしたことをしてませんし、まだまだごちゃごちゃしているのはゆるして下さい(土下座)。

Surfaceメソッドは、もう固定でこういうふうに使うと覚えたほうがいいかもしれませんね。

これで初心者脱出だ!

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です