Canvasクラス

android.graphicsCanvasクラス

Canvas

 状態:-  閲覧数:1,198  投稿日:2014-02-16  更新日:2014-02-16  
・グラフィック

クラス構成

 閲覧数:377 投稿日:2014-02-16 更新日:2014-02-16 

親クラス



java.lang.Object
  ↳ android.graphics.Canvas



メソッド一覧

 閲覧数:380 投稿日:2014-02-17 更新日:2014-02-17 
drawCircle
・座標、半径、描き方を指定

コード例

 閲覧数:408 投稿日:2014-02-18 更新日:2014-02-18 

例1


スレッドを用いたグラフィック描画処理(円の表示)
・2つのクラスから構成

Activityクラスを継承したHelloAndroid7Activityクラス
・全体的な処理

HelloAndroid7Activityクラス内で定義している、Viewクラスを継承したDrawViewSampleクラス
・スレッドを用いたグラフィック描画処理(円の表示)
・描画処理をすべてソースコードで記述できるように、ビューをXMLから生成するのではなく、動的に定義して生成

Paintクラス … 図形の描き方に関する設定
・ここでは、円の色、線の幅、線のスタイルなどを指定

座標の設定
・Mathクラスの三角関数を用いて、円弧の座標を求めている

スレッドの内容
・スレッドとして実行している処理は、実質、ix++とpostInvalidateメソッドの呼びだしの2行だけ
・postInvalidateメソッドが、画面の再描画をリクエスト
   ↓
・このメソッドを受けて、Androidでは再描画処理を実施
   ↓
・onDrawメソッドが呼ばれる
   ↓
・onDrawメソッドで描画するたびに、円の座標が進んでいるため、動いているように見える

▼ /HelloAndroid7/src/android/style/HelloAndroid7Activity.java
package android.style;

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.view.View;

import static java.lang.Math.toRadians;
import static java.lang.Math.cos;
import static java.lang.Math.sin;

public class HelloAndroid7Activity extends Activity {

// 独自のビュー
DrawViewSample v;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
v = new DrawViewSample(getApplication());
setContentView(v);
}

@Override
protected void onResume() {
super.onResume();
v.onResume(); // スレッド終了の呼び出し
}

@Override
protected void onPause() {
super.onPause();
v.onPause(); // スレッド生成、開始の呼び出し
}

class DrawViewSample extends View {

int status = 0; // 状態管理変数
int ix = 0;
Thread timer;

// (1)スレッドとして実行したい処理の定義。無名クラスを用いてRunnableインタフェースを実装
Runnable task = new Runnable() {
public void run() {
// statusが0の間実行する
while (status == 0) {
ix++; // 座標更新のためインクリメント(円弧の座標を進めるため)
postInvalidate(); // 画面更新依頼。Viewクラスで定義されたメソッドで、画面の再描画をリクエストする。画面を無効にし、描き直すようにAndroidに伝える
try {
Thread.sleep(100); // 処理の間隔をあけるために、スレッドを100ミリ秒間待機
} catch (InterruptedException e) {
}
}
}
};

public DrawViewSample(Context context) {
super(context);
}

// (2)スレッドの開始
public void onResume() {
timer = new Thread(task);
timer.start();
}

// (3)スレッドの終了。Threadクラスのjoinメソッドを使って、スレッドが終わるまでアプリケーションを待機させている。この例では、joinメソッドでの待機を省いても問題ないが、スレッドが終わる前にアプリケーション本体が終了してしまう、といった事態を防ぐために、通常joinメソッドで待機するようにする
public void onPause() {
status = 1; // スレッドを終了させる
try {
timer.join(); // スレッドが終了するまで待機
} catch (InterruptedException e) {
}
}

@Override
protected void onDraw(Canvas canvas) {// Canvasクラスのオブジェクトが渡される
super.onDraw(canvas);

// 描き方の指定
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStrokeWidth(2);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);

// 座標の設定。Mathクラスの三角関数を用いて、円弧の座標を求めている
double r = toRadians(6 * this.ix);
double x = 100 + 50 * cos(r);
double y = 100 + 50 * sin(r);

// 線で円を描く
canvas.drawCircle((float)x, (float)y, 5, paint);
}
}
}


・xml … レイアウト
▼/HelloAndroid7/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

</LinearLayout>



コメント投稿(ログインが必要)