View関連

[Tips]

[edit]

画像を画面サイズに合わせる

http://www.ore-memo.com/914.html

 bmp = BitmapFactory.decodeResource(res, R.drawable.back);
 WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
 Display dp = wm.getDefaultDisplay();
 dp_w = dp.getWidth();
 dp_h = (dp_w / 2) * 3;
 bmp = Bitmap.createScaledBitmap(bmp, dp_w, dp_h , true);
[edit]

javaコード内に書く

        LinearLayout l = new LinearLayout(this);
        l.setOrientation(LinearLayout.VERTICAL);
        setContentView(l);
        screen = new Screen(this);
        l.addView(screen);
[edit]

XMLで作る

        setContentView(R.layout.activity_main);
[edit]

XML内に自作viewを貼る

  • 一つ目は、Viewクラスのコンストラクタの引数を(Context context, AttributeSet attrs) にすること。
  • 二つ目は、onMeasure(int widthMeasureSpec, int heightMeasureSpec)を定義すること。
  • 最後に、Viewの名前を付けたXMLタグを専用のレイアウトに放り込むこと。(これは自信ない

http://d.hatena.ne.jp/koko_u/20120101

[edit]

描画

  • View に描く方法は、動的に変化しないシンプルなグラフィックを描きたいときには最適な選択となります。
  • Canvas に描く方法は、アプリケーションが定期的な再描画を要求するときは良い選択となります。

CanvasクラスのコンストラクタにBitmapクラスのインスタンスを与えます。そうすることでこのCanvasオブジェクトに描画した内容は画面ではなくBitmapに描画されることになります。

[edit]

View への描画

View のバックグラウンドに描画するだけです。
ImageView の場合は、content に対して描画します。

[edit]

Canvas への描画

Canvas を使うと、Window に配置される Bitmap へ直接描画することができます。

まずは、Bitmap とそれに対応する Canvas インスタンスを作成します。

 Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); // 新規作成
 
 Resources r = getResources();
 Bitmap b = BitmapFactory.decodeResource(r, R.drawable.img1); // リソースから取得
 Canvas c = new Canvas(b); //BitmapからCanvasを生成
 
 //↑と同義
 c = new Canvas();
 c.setBitmap(b);

これで、この Canvas に対する描画処理が Bitmap に反映されるようになります。
また、Bitmap の内容を Canvas に反映させることもできます。
これには、Canvas.drawBitmap(Bitmap, ...) メソッドを使います。

Canvas クラスは、drawBitmap, drawRect, drawText など様々な描画メソッドを持っています。

 //ぬりつぶす
 c.drawColor(Color.BLACK);
 
 //Paintオブジェクトで図形をcanvasに描画
 Paint paint = new Paint();
 c.drawCircle(100, 100, 100, paint);
 
 //テキストをcanvasに描画
 c.drawText("90mSv/h", 200, 100, paint);
 
 //Bitmapをcanvasに描画
 c.drawBitmap(bmp, 0, 0, null);

ImageView に貼りつける。

 //BitmapをImageViewに描画
 ImageView image = (ImageView)findViewById(R.id.imageView1);
 image.setImageBitmap(bmp);
  • 他に、Drawable というインターフェイスがあります。

このインターフェイスを持つ実装クラス(例えば ShapeDrawable)に対して処理を行った後
Drawable.draw(Canvas) を呼び出すことによって、その内容を Canvas に反映させることができます。

  • View を使った Canvas への描画

もしアプリケーションがそれほど多くのフレームレート数を要求しない場合
カスタム View に対して onDraw() メソッドを実装してその中で Canvas に描画する
再描画が必要になったら invalidate() メソッドを呼び出します。※「すぐに」呼び出されることは保障されていません

onDraw(Canvas) の中で、この Canvas インスタンスに対して描画処理を行いましょう。
このメソッドが終わると、Android フレームワークは Canvas の内容をBitmap に反映させ、画面に表示します。
メインスレッド以外から invalidate() メソッドを呼び出す場合は、代わりに postInvalidate() を呼び出しましょう

  • SurfaceView を使った Canvas への描画

SurfaceView を使うことで、描画処理を別スレッドで処理できるようになります。

[edit]

[edit]

ImageViewの画像からBitmapを生成

androidアプリでImageViewに表示されている画像を、Bitmap形式で取り出す方法です。

 // idからイメージビューを取得。
 ImageView imageView = (ImageView)findViewById(R.id.[ImageViewのID]);
 
 // getDrawableメソッドで取り出したものを、BitmapDrawable形式にキャストして保存。
 BitmapDrawable bd = (BitmapDrawable)imageView.getDrawable();
 
 // getBitmapメソッドでビットマップファイルを取り出す。
 Bitmap bmp = bd.getBitmap();