drawable 画像の大きさを調整する


同じ画像ファイルを res/drawable に置いた場合と、assets に置いた場合で、表示される画像の大きさが異なります。
bitmap 画像の大きさを調整する では、bitmap 形式で読み込んだ場合でした。
この記事では drawable 形式で読み込んだ場合の話をします。

1. res/drawable にある画像ファイルを表示する

Drawable drawable = getResources().getDrawable( R.drawable.sample );
imageview.setImageDrawable( drawable );

100dp (150px) で表示されます。
dp = density (ピクセル密度) * px

2. assets にある画像ファイルを表示する

InputStream is = getResources().getAssets().open( "sample.png" );
Drawable drawable = Drawable.createFromStream( is, ”” );
imageview.setImageDrawable( drawable );

1より小さく表示されます。
bitimap と drawable の間には、下記の関係があるようです。
(明文化しているものが見つからなかった)
bitimap = density * drawable
つまり、100px の画像ファイルは、67px の drawable になります。

3. drawable の大きさを調整する
2 で取得した drawable に対して、density の2乗にすれば、1 と同じ大きさで表示されます。
ところが、drawable に対して、画像の比率を簡単に変更する方法がないようです。
そのため、下記のような手順をとることになります。
(1) 取得した drawable を bitimap に変換する
(2) bitimap の比率を density の2乗にする
(3) bitimap を drawable に変換する

サンプルコードは code.google で公開しています。


bitmap 画像の大きさを調整する


同じ画像ファイルを res/drawable に置いた場合と、assets に置いた場合で、表示される画像の大きさが異なります。

1. res/drawable にある画像ファイルを表示する

imageview.setImageResource( R.drawable.sample );

100dp (150px) で表示されます。
dp と px には下記の関係があります。

dp = density (ピクセル密度) * px

2. assets にある画像ファイルを表示する

InputStream is = getResources().getAssets().open( "sample.png" );
Bitmap bm = BitmapFactory.decodeStream( is );
imageview.setImageBitmap( bm );

一回り小さく表示されます。
これは、1の場合は dp 単位で表示されるのに対して、2の場合は px 単位で表示されているためです。
スクリーンショットにて、一番の左の目盛りは px 単位、2番目の目盛りは dp 単位です。
1の場合は 100dp で表示されるのに対して、2の場合は 100px で表示されています。

3. bitmap の大きさを調整する
下記のように density (ピクセル密度) を設定することで、同じ大きさで表示されます。

bm.setDensity( DisplayMetrics.DENSITY_MEDIUM );

サンプルコードは code.google で公開しています。

参考
Android 開発ガイド: dp 単位からピクセル単位への変換


TextView に画像を表示する


TextView に画像を表示するには、下記の4つの方法がある。
1. TextView#setCompoundDrawablesWithIntrinsicBounds( Resource ID )
2. TextView#setCompoundDrawablesWithIntrinsicBounds( Drawable )
3. TextView#setCompoundDrawables( Drawable )
4. TextView#setText( Spanned )

サンプルコードは code.google で公開しています。

1. TextView#setCompoundDrawablesWithIntrinsicBounds( Resource ID )
TextViewの境界線に描画可能なオブジェクト (Drawables) を合成するメソッド
テキストの左側にアイコンを表示する例。

tv.setCompoundDrawablesWithIntrinsicBounds( R.drawable.icon, 0, 0, 0 );

2. TextView#setCompoundDrawablesWithIntrinsicBounds( Drawable )
1と同じメソッドで引数が違う。

Drawable d = getResources().getDrawable( R.drawable.icon );
d.setBounds( 0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight() );
tv.setCompoundDrawablesWithIntrinsicBounds( d, null, null, null );

3. TextView#setCompoundDrawables( Drawable )
TextViewの周りに描画可能なオブジェクト (Drawables) を合成するメソッド
2との違いはよく分からない。

Drawable d = getResources().getDrawable( R.drawable.icon );
d.setBounds( 0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight() );
tv.setCompoundDrawables( d, null, null, null );

4. TextView#setText( Spanned )
TextViewにテキストを設定するメソッド。
一般的な引数は CharSequence だが、 SpannedSpannableString も使用できる。

String html = "<img src=¥"" + R.drawable.icon + "¥">";
Spanned spanned	= Html.fromHtml( html, mImageGetter, null );
tv.setText( spanned );
private ImageGetter mImageGetter = new ImageGetter() { 
	public Drawable getDrawable( String source ) {
		int id = Integer.parseInt( source );
		Drawable d = getResources().getDrawable( id );
		d.setBounds( 0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight() );
		return d; 
	} 
};

参考
TextView を使いこなそす: TextView に画像を表示させる
TextView を使いこなそう:android.text.Html を用いて TextView に多彩な表現を
TextView を使いこなそう:android.text.Html#fromHtml() で タグと タグを使う