Android 4.0で追加された描画API


Android4.0(以下、ICS)から、Graphicsから取得できる情報が増えました。

新たに取得できるようになった情報は、イカの通りです。

android.graphics.Canvas

メソッド詳細
int getMaximumBitmapHeight()Canvasの高さ最大サイズを返します。
int getMaximumBitmapWidth() Canvasの幅最大サイズを返します。

サンプルコード

Canvasの最大サイズを取得する

ICSから新たに、設置できるCanvasの最大サイズを取得することができるようになりました。
具体的には、イカのようにします。
■src/GraphicsSample.java

//Canvasの設定できる最大の高さ
Int maxHeight = canvas.getMaximumBitmapHeight();
//Canvasの設定できる最大の幅
Int maxWidth = canvas.getMaximumBitmapWidth();

Canvasの最大の高さを取得するにはCanvasクラスのgetMaximumBitmapHeightメソッドを、最大の幅を取得するにはCanvasクラスのgetMaximumBitmapWidthメソッドを使用します。
もし新たに設置しようとしているビットマップの高さ、幅が上記コードのmaxHeight、maxWidthを超えた場合、エラーとなります。

android.graphics.Paint

メソッド

メソッド詳細
int getHinting()ペイントのヒントの有無を返します。
HINTING_OFF(0)かHINTING_ON(1)のいずれかで返されます。
void setHinting(int)ペイントのヒントの有無を設定します。
HINTING_OFF(0)かHINTING_ON(1)のいずれかで設定します。

フィールド

フィールド詳細
int HINTING_OFFヒントの有無を設定するメソッドsetHinting(int)へのオプションで、ヒントを無しにします。
値は0です。
int HINTING_ONヒントの有無を設定するメソッドsetHinting(int)へのオプションで、ヒントを有りにします。
値は1です。

サンプルコード

Paintのヒントを設定する

ICSから、Paintにヒントを持たせる事ができるようになりました。
ヒントを持たせるには、イカのようにします。
■src/GraphicsSample.java

Paint paint = new Paint();
//ヒントを設定する
paint.setHinting(Paint.HINTING_ON);
//ヒントの有無を取得する
int hint = paint.getHinting();

setHintingメソッドの引数として、ヒントを設定したい場合はPaint.HINTING_ONを、設定しない場合はPaint.HINTING_OFFを入れます。
ヒントを設定したい場合は0、設定したい場合は1を入力することも可能ですが、将来のAndroid更新など拡張時に困ったことになるため、数字の直接入力はすべきではありません。

ヒントの有無を知りたい際には、PaintクラスのgetHintingメソッドを使います。
ヒントがある場合は1が、無い場合は0が返されます。

android.graphics.RectF

メソッド詳細
String toShortString ()
四角形を文字列で表現して返されます。
始点と終点で表現されます。

サンプルコード

四角形の始点と終点を取得する

ICSから、四角形(RectF)の始点と終点を取得することが用意になりました。
具体的には、イカのようにします。
■src/GraphicsSample.java

RectF r = new RectF(250, 20, 300, 70);
String shortString = r.toShortString();
Log.d("test", "r.shortString = " + shortString);

四角形の始点と終点を取得するには、RectFクラスのtoShortStringメソッドを使います。
toShortStringメソッドを用いて取得した四角形の始点と終点は、次のような文字列として取得されます。

11-24 02:09:03.527: D/test(1556): r.toShortString = [250.0,20.0][300.0,70.0]

始点と終点が、カッコ [ ] で囲まれてそれぞれ取得されます。
1つ目のカッコには始点の位置[x, y]が、1つ目のカッコには終点の位置[x, y]が格納されています。

android.graphics.SurfaceTexture

メソッド詳細
long getTimestamp ()updateTexImageに対する呼び出しによって設定されたtextureイメージの最新更新時刻を取得します。
void release ()全てのバッファを解放し、SurfaceTextureを破棄状態します。

サンプルコード

SurfaceTextureが更新された最新の時間を取得する

ICSから、SurfaceTextureが更新された最新の時間を取得することができるようになりました。
イカのようにして時間を取得します。
■src/GraphicsSample.java

long time = surfaceTexture.getTimestamp();

SurfaceTextureクラスのgetTimestampメソッドで取得された情報は、ナノ秒単位で取得されます。

SurfaceTexture上のデータをリリース(削除)するには、イカのようにします。
■src/GraphicsSample.java

surfaceView.release();

一度SurfaceViewクラスのreleaseメソッドを使うと、元に戻す事はできません。
releaseメソッドを使用する際には、十分注意が必要です。

アプリの中で使ってみる

以上が、ICSで新たに追加された描画APIです。
これらのAPIを実際に使うには、onDrawでCanvasを描くときに使います。

onDrawではイカのようにします。
■src/GraphicsSample.java

public class GraphicsSample extends View {
	public GraphicsSample(Context context) {
		super(context);
	}

	@Override
    public void onDraw(Canvas canvas) {
    	Log.d("test", ""+ canvas.getMaximumBitmapHeight());
    	Log.d("test", ""+ canvas.getMaximumBitmapWidth());

    	Paint paint = new Paint();
    	paint.setColor(Color.RED);
    	paint.setHinting(Paint.HINTING_ON);

    	canvas.drawCircle(100, 100, 100, paint);
    	Log.d("test", ""+ paint.getHinting());

    	paint.setColor(Color.BLUE);
    	RectF r = new RectF(250, 20, 300, 70);
    	canvas.drawRect(r, paint);
    	String shortString = r.toShortString();
    	Log.d("test", "r.shortString = " + shortString);
    }
}

8,9行目:Canvasの最大の高さと幅を取得し、ログへ表示しています。

13行目:Paintのヒントを有り状態にし、16行目でPaintのヒントの有無をログへ表示しています。

21,22行目:RectF(四角形)の始点と終点を取得、ログへ表示をしています。

上のサンプルを実行すると、次のようにログが出力されます。

11-25 17:13:36.573: D/test(570): 32766
11-25 17:13:36.573: D/test(570): 32766
11-25 17:13:36.583: D/test(570): 1
11-25 17:13:36.593: D/test(570): r.shortString = [250.0,20.0][300.0,70.0]

1行目から順に

1.Canvasの最大の高さサイズ
2.Canvasの最大の横幅のサイズ
3.Paintのヒントの有無
4.RectF(四角形)の始点と終点の位置座標

を表示しています。