Androidアプリ作成講座 8-円を描画する

2020年7月17日

講座のプログラムも終わりが近づきました。今回は、円を描画してみます。円は、画面の縦横で短い方の幅の半分になるような円を描画します。デバイスによって解像度が違うため、縦横サイズを測ってから円を描画します。

円は画面の上端に接して、左右は中央になるように描画します。

1.SurfaceViewソース

package kunimiyasoft.circletest;
import android.content.Context;
import android.view.SurfaceView;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder;
    // 画面サイズ
    private int screenWidth ;
    private int screenHeight ;
    public MySurfaceView(Context context) {
        super(context);
        holder = getHolder();
        holder.addCallback(this);
    }
    // 変化があった時
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        screenWidth = width ;
        screenHeight = height ;
        myDraw() ;
    }
    // 作成された時
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }
    // 破棄される時
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
    public void myDraw() {
        int radius ;
        int circle_x ;
        int circle_y ;
        // 円の半径と座標の位置を計算する
        if (screenWidth < screenHeight) {
            radius = screenWidth / 4 ;
        } else {
            radius = screenHeight / 4 ;
        }
circle_x = screenWidth / 2 ;</span>
circle_y = radius ;</span>
        Canvas canvas = holder.lockCanvas();
        Paint paint = new Paint();
        // 円の描画
        paint.setStyle(Paint.Style.STROKE); // 塗りつぶし無し
        paint.setColor(Color.argb(255, 0, 0, 0)); // 色は黒で不透明
        paint.setStrokeWidth(5) ; // ペンの太さ
        canvas.drawCircle(circle_x, circle_y, radius, paint);
        // 元に戻す
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL); // 塗りつぶし
        holder.unlockCanvasAndPost(canvas);
    }
}

2.画面サイズの取得

// 画面サイズ
private int screenWidth ;
private int screenHeight ;

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
screenWidth = width ;
screenHeight = height ;

画面のサイズを保持するメンバ変数を用意しておいて、surfaceChanged関数でサイズを受け取ります。

3.円の大きさと座標の計算

int radius ;
int circle_x ;
int circle_y ;

// 円の半径と座標の位置を計算する
if (screenWidth < screenHeight) {
radius = screenWidth / 4 ;
} else {
radius = screenHeight / 4 ;
}
circle_x = screenWidth / 2 ;
circle_y = radius ;

myDraw関数で、円のサイズと位置を計算します。縦と横の幅が狭い方を基準にして、その幅の半分の円の半径を計算しています。

また、円の座標は、上端に接するように、左右は中央になるように計算しています。

これはAndroidの仕様ではなく、今回の仕様ですので、自由に変えても構いません。

4.円の描画

// 円の描画
paint.setStyle(Paint.Style.STROKE); // 塗りつぶし無し
paint.setColor(Color.argb(255, 0, 0, 0)); // 色は黒で不透明
paint.setStrokeWidth(5) ; // ペンの太さ
canvas.drawCircle(circle_x, circle_y, radius, paint);

// 元に戻す
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL); // 塗りつぶし

前の投稿で描画した文字の行は削除してください。

ブラシの定義を行います。まず、円は塗りつぶさない設定にします。そして、円のカラーを定義しています。argb関数を使うことで、自由な色を設定することができます。また、透明度の指定も可能です。

次に、ペンの太さを設定します。例では5ドットにしています。

そして、drawCircle関数で円を描画します。

描画が終わったら、ブラシを元に戻しています。

5.基本的なビューへの描画は今回で終了です

ソースの記述ができたら、ビルドして実行してみましょう。円が描画されました。

これで、キャンバスへ図形を描画する講座の大部分は終わりました。最後に円を動かすことをしますが、これは一気に内容が高度化するので、おまけと考えてください。

次回は、プログラムをいったんお休みして、デバッガの使い方を学びます。

(LIST)Androidアプリ作成講座

Androidアプリ作成講座 プロローグ
Androidアプリ作成講座 1-プロジェクトを作る
Androidアプリ作成講座 2-プロジェクトを確認する
Androidアプリ作成講座 3-エミュレーター環境を作る
Androidアプリ作成講座 4-SurfaceViewクラスを作成する
Androidアプリ作成講座 5-SurfaceViewをActivityにセットする
Androidアプリ作成講座 6-SurfaceViewがイベントを受け取れるようにする
Androidアプリ作成講座 7-キャンバス上で描画する
Androidアプリ作成講座 8-円を描画する
Androidアプリ作成講座 9-デバッガを使ってみよう
Androidアプリ作成講座 10-Animationクラスを使う
Androidアプリ作成講座 11-円移動のソース