Tips

SurfaceViewを用いた簡単なAndroidサンプルアプリ

SurfaceViewを用いた簡単なAndroidサンプルアプリ

※はじめに
この記事はAndroidアプリの開発が、初心者であるという方のための記事です。
そのため、なるべく複雑な説明は避け、コピー&ペイストですぐに動くものをご紹介します。
JavaやAndroidを理解されている方で細かい説明が必要な方は、当ブログ内の連載記事である「Android Tips」をご覧ください。

さて、今回は画面に四角を出します。
この子はタッチするたびに色が変わります。

アプリ実行図

1

2

3

4

サンプルコード

  • 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>
    


  • MainActivity.java(Activityファイル)
  • 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です。

Androidアプリ開発の必須知識!JAVAプログラミングを学べる連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search