Tips

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

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

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

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

アプリ実行図

1

2

3

4

サンプルコード

  • activity_main.xml(画面レイアウトファイル)
  • 今回は画像を設置するImageVIewと、動作のキッカケとなるボタンのみ定義しています。
    14行目でImageViewに画像をセットしておりますが、今回はデフォルトの画像を指定しています。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <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ファイル)
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    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