スレッド処理
Viewを利用した画面などを更新をあまりしないでいいもの、たとえば作成した15パズルや、業務データアプリなどは何かのタイミングで任意に画面などを更新すればいいですよね。しかし画像の移動などを使うゲームやリアルタイムチャットなどは一定の間隔で更新しなければいけません。そのためのSurfaceViewと呼ばれるメソッドが用意されています。それがスレッド処理と呼ばれるものです。わたしのイメージ的にはViewを使った処理では、10個画像があったら1つずつ画像を作成して1つずつ画像を表示していきますが、SurfaceViewでは10個作成して表示を一度の処理でやるイメージでしょうか。
おためしで
SurfaceViewを使ったプログラミングを組むにあたり、もっと効率的なやり方があると思うのですが、その勉強をする前にわたしはがまんができなくなり無理やり使用して作成することにしました。なので今回はSurfaceViewの紹介くらいに思っておいて下さい。
今回作成使用したファイルは3つです。
|
ファイル名「SerfaceViewActivity.java」
03 | import android.app.Activity; |
04 | import android.os.Bundle; |
05 | import android.graphics.*; |
08 | public class SerfaceViewActivity extends Activity { |
11 | public void onCreate(Bundle savedInstanceState) { |
12 | super.onCreate(savedInstanceState); |
13 | requestWindowFeature(Window.FEATURE_NO_TITLE); |
14 | getWindow().setFormat(PixelFormat.TRANSLUCENT); |
15 | setContentView( new SurfaceViewView( this )); |
|
|
|
ファイル名「SurfaceViewView.java」
03 | import android.content.Context; |
04 | import android.view.SurfaceHolder; |
05 | import android.view.SurfaceView; |
06 | import android.graphics.*; |
09 | public class SurfaceViewView extends SurfaceView implements SurfaceHolder.Callback,Runnable{ |
10 | public static final int BOXKAZU = 10; |
11 | public static final int BOXBIG = 100; |
12 | public static final int BOXMIN = 10; |
13 | public static final int MAXBOXVXY = 20; |
14 | public static final int MINBOXVXY = 5; |
15 | private SurfaceHolder holder; |
18 | private boolean start= false ; |
20 | private RectBox[] rect = new RectBox[BOXKAZU]; |
23 | public SurfaceViewView(Context context) { |
27 | holder.addCallback( this ); |
28 | holder.setFixedSize(getWidth(), getHeight()); |
38 | canvas = holder.lockCanvas(); |
39 | canvas.drawColor(Color.WHITE); |
41 | p.setColor(Color.BLACK); |
43 | for ( int i=0;i<box;i++){ |
44 | rect[i].DrawBox(canvas, p); |
49 | holder.unlockCanvasAndPost(canvas); |
53 | } catch (Exception e){} |
58 | public void surfaceChanged(SurfaceHolder holder, int format, int width, |
64 | public void surfaceCreated(SurfaceHolder holder) { |
66 | thread = new Thread( this ); |
70 | public void surfaceDestroyed(SurfaceHolder holder) { |
76 | public boolean onTouchEvent(MotionEvent event ){ |
77 | int action = event .getAction(); |
78 | int x = ( int ) event .getX(); |
79 | int y = ( int ) event .getY(); |
81 | case MotionEvent.ACTION_DOWN: |
83 | case MotionEvent.ACTION_UP: |
84 | if (box<BOXKAZU && x<getWidth()-BOXBIG && y<getHeight()-BOXBIG){ |
86 | rect[box] = new RectBox(); |
87 | rect[box].init(x,y,BOXBIG,BOXMIN,MAXBOXVXY,MINBOXVXY,getWidth(), getHeight()); |
|
|
|
ファイル名「RectBox.java」
04 | import java.util.Random; |
06 | import android.graphics.Canvas; |
07 | import android.graphics.Color; |
08 | import android.graphics.Paint; |
09 | import android.graphics.Rect; |
24 | public void init( int x, int y, int b, int m, int maxvxy, int minvxy, int ww, int wh){ |
25 | Random r = new Random( new Date().getTime()); |
30 | vx = r.nextInt(maxvxy-minvxy)+minvxy; |
31 | if (r.nextInt(100)>50) vx *= -1; |
32 | vy = r.nextInt(maxvxy-minvxy)+minvxy; |
33 | if (r.nextInt(100)>50) vy *= -1; |
34 | col = Color.rgb(r.nextInt(240)+10, r.nextInt(240)+10, r.nextInt(240)+10); |
35 | bxy = r.nextInt(b-m)+m; |
39 | public void DrawBox(Canvas c, Paint p){ |
40 | p.setStyle(Paint.Style.FILL); |
42 | c.drawRect( new Rect(px,py,px+bxy,py+bxy), p); |
47 | if (px<0 || gw<px+bxy) vx =- vx; |
48 | if (py<0 || gh<py+bxy) vy =- vy; |
|
|
|
 |
|
このプログラムの説明
画面をタッチして話すとボックスが生成され移動します。画面端にくると反射してまた移動を繰り返します。
タッチできる範囲は画面右、画面下の範囲からボックスの最大大きさで設定した分をマイナスした範囲(100とすると座標0,0から座標380、754)内がタッチ可能範囲となります。これはその範囲外でタッチした時に、ボックスの大きさが画面外に出てしまうのを避けるためです。
Surfaceメソッドで自動生成されるメソッドがあったりでちょっと長くなっていますが、runメソッドに中に処理を書きtry{}catchでしめる感じでしょうか。
プログラムの流れは、SurfaceViewViewが呼び出された時に、runが呼び出され内容が処理されていくかんじです。
最初はボックスは生成されず、タッチし、離した時に配列設定しているRectBoxクラスが生成されます。
RectBoxが呼び出された時のコンストラクタでボックスの値を初期化してもよかったのですが、初期化処理initと分けました。
初期化はタッチした位置でボックス生成、移動量は設定範囲でランダム。if文でのマイナスの設定は、動き出しの方向を決める設定で、100のうち50より大きければマイナス。というふうに二分の一の確率でマイナスに設定。カラーはRGBのそれぞれを255の中をランダムで設定。すべて0だと白になりそれでは見えないので10以上になるように設定。最後にボックスの大きさも設定されたランダムで設定このクラスには3つのメソッドがあり、初期化、表示、移動の3つだけの簡単なものです。
全然たいしたことをしてませんし、まだまだごちゃごちゃしているのはゆるして下さい(土下座)。
Surfaceメソッドは、もう固定でこういうふうに使うと覚えたほうがいいかもしれませんね。
これで初心者脱出だ!