SurfaceViewを用いた簡単なAndroidサンプルアプリ
※はじめに
この記事はAndroidアプリの開発が、初心者であるという方のための記事です。
そのため、なるべく複雑な説明は避け、コピー&ペイストですぐに動くものをご紹介します。
JavaやAndroidを理解されている方で細かい説明が必要な方は、当ブログ内の連載記事である「Android Tips」をご覧ください。
さて、今回は画面に四角を出します。
この子はタッチするたびに色が変わります。
アプリ実行図
サンプルコード
- activity_main.xml(画面レイアウトファイル)
今回は画像を設置するImageVIewと、動作のキッカケとなるボタンのみ定義しています。
14行目でImageViewに画像をセットしておりますが、今回はデフォルトの画像を指定しています。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </RelativeLayout>
package com.example.surfaceviewsample; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MainActivity extends Activity { private static final String TAG = "SurfaceViewSample"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainView view = new MainView(this); setContentView(view); } // SurfaceViewクラスを継承したクラスを作成 class MainView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder = null; private int[] color = { Color.YELLOW, Color.BLUE, Color.RED, Color.GREEN }; private int idx = 0; // MainViewクラスのコンストラクタ public MainView(Context context) { super(context); // getHolder()メソッドを用いてSurfaceHolderオブジェクトを取得 holder = getHolder(); // addCallback()を用いて、SurfaceHolder.Callbackオブジェクトをリスナー登録する holder.addCallback(this); } // SurfaceViewのサイズなどが変更されたときに呼び出されるメソッド @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.e(TAG, "surfaceChanged()"); } // SurfaceViewが最初に生成されたときに呼び出されるメソッド @Override public void surfaceCreated(SurfaceHolder holder) { Log.e(TAG, "surfaceCreated()"); draw(); } // SurfaceViewが破棄されるときに呼び出されるメソッド @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.e(TAG, "surfaceDestroyed()"); } // SurfaceViewにてタッチイベントが検知されたときに呼び出される @Override public boolean onTouchEvent(MotionEvent event) { Log.e(TAG, event.toString()); // getAction()メソッドを用いて、eventよりタッチイベントのアクションを取得 if (event.getAction() == MotionEvent.ACTION_UP) { draw(); } return true; } // 描画 private void draw() { // lockCanvas()メソッドを使用して、描画するためのCanvasオブジェクトを取得する Canvas canvas = holder.lockCanvas(); // 画面全体を一色で塗りつぶすdrawColor()メソッドを用いて画面全体を白に指定 canvas.drawColor(Color.WHITE); // Paintクラスをインスタンス化 Paint paint = new Paint(); // カラーを指定 paint.setColor(color[idx]); // Canvas.drawRect()を呼び出すと、正方形や長方形を描画することが可能になる // (left:左辺,top:上辺,right:右辺,bottom:下辺,Paintインスタンス) canvas.drawRect(50, 100, 200, 300, paint); // Canvasオブジェクトへの描画完了したら、unlockCanvasAndPost()メソッドを呼び出し、引数にはCanvasオブジェクトを指定する holder.unlockCanvasAndPost(canvas); // 三項演算子( 条件式 ? 式1 : 式2) // ?の前までがif文の条件式 // ?の前の値がtrue→:の前の値が返される // ?の前の値がfalse:の後の値が返される idx = (idx == color.length - 1) ? 0 : idx + 1; } } }
以上でOKです。