グラフィック描画とViewクラス


JavaのAWTやSwingなどでは、グラフィックの描画を行わせる場合には、そのためのコンポーネントクラスを定義し、その中にpaintメソッドなどを用意して描画を行わせていましたね。ではandroidではどうやってグラフィックを描画するのでしょうか。

基本的な考え方は、実はAWTなどとほぼ同じです。すなわち、専用のクラスを定義し、それを画面にはめ込んで表示する。専用クラスの中には、描画のためのメソッドを用意して、そこで描画の処理を実行する。そういうスタイルですね。

グラフィック表示用に用意するクラスは、一般に「View」クラスのサブクラスとして作成します。Viewというのは、画面に表示される部品類(ビュー)の基本となるクラスです。このクラスを継承したクラスを用意し、それをActivityクラスに組み込みます。この組み込み処理は、「setContentView」メソッドを使って行います。

Viewのサブクラスは、だいたい以下のような形で定義します。

class クラス extends View {

  public コンストラクタ(Context context) {
    super(context);
    ……初期化処理……
  }
  
  public void onDraw(Canvas c){
    ……描画の処理……
  }
  
}

スーパークラスであるViewには、Contextを引数に持つコンストラクタしか用意されておらず、引数なしのデフォルトコンストラクタはありません。したがって、必ずContextを引数に持つコンストラクタを定義する必要があります。これは、特に処理がなければsuperするだけでかまいません。

実際の描画処理を用意するのが、「onDraw」メソッドです。これは「Canvas」というクラスが引数に渡されます。これは、AWT/SwingにおけるGraphicsクラスに相当するものとイメージするとよいでしょう。

グラフィック描画の雛形を作る


では、実際に簡単なサンプルを造ってみましょう。とりあえずは、何も表示しない、プログラムの骨格部分を作成してみましょう。ここではDrawViewというクラスを定義し、これを表示させるようにしておきましょう。

package jp.allabout.android;

import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.view.View;

public class MyAndy extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    DrawView view = new DrawView(getApplication());
    setContentView(view);
  }
}

class DrawView extends View {

  public DrawView(Context context) {
    super(context);
  }
  
  public void onDraw(Canvas c){
    // TODO: ここに描画処理を追加
  }
  
}

これを実行しても、画面は真っ暗でまだ何も表示はされません。とりあえず、これで「入れ物」はできました。これに追加しながら描画を行っていきましょう。