ImageView

今回はImageViewについて説明したいと思います。


Androidで図形などを直接描画して表示するには、Viewクラスか、SurfaceViewを使うのが適切だと思ってました。
しかし、実際にコーディングしてアプリケーションを動かしてみたところ、どうもうまくいかない。


Viewを実装したアプリケーションはちゃんと動きましたが、マシンに対する負荷が高く、図形を直接描画したりするのには向いてないようです。図で説明するとこんな感じです。



CPU使用率が100%になるということは、毎フレーム画面を更新しているせいですかね?ThinkpadX30なんかで開発してるのが悪い?
僕としては画面の更新は一回だけでいいんです。


SurfaceViewを使えばCPUの負荷が少なくて済むようですが、自分としては毎フレーム画面を更新する必要はないので(必要なときに一回だけ更新したい)、ImageViewクラスを使うことにしました。
自前で作成したBitmapを、ImageViewのsetImageBitmap()で渡してやれば任意の図形を描画して、一回だけ画面を更新する事ができます。

  • Bitmapクラスを任意のサイズで作成
  • 作成したBitmapをCanvasクラスに渡す
  • Canvasクラスを使って色々描画
  • setImageBitmapに作成したBitmapセットする



public class TestView extends ImageView  {

	private Bitmap mBmp = null;
	public TestView(Context context, AttributeSet attrs) {
		super(context, attrs);
		setFocusable(true);
		requestFocus();
	}
	private void drawChart() {
		
		int width = getWidth();
		int height = getHeight();
		int margin = 6;
		int r = (width/2 + height/2) / 3;
		int rxCenter = width / 2;
		int ryCenter = height / 2 - margin;
		
		//Bitmap画像を作成
		if (mBmp == null) {
			mBmp = Bitmap.createBitmap(
					getWidth(), getHeight(),Bitmap.Config.ARGB_8888);
		}
		Canvas canvas = new Canvas(mBmp);
		
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setStyle(Paint.Style.FILL);
		
		//背景を塗りつぶす
		paint.setColor(getResources().getColor(R.color.lightBlack));
		canvas.drawRect(0.0f, 0.0f, width, height, paint);
		//円を描く
		paint.setColor(getResources().getColor(R.color.smoke));
		canvas.drawCircle(rxCenter, ryCenter, r, paint);
		//ImageViewにセットする
		this.setImageBitmap(mBmp);
	}
}