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です。



