« Windows で Android のソースコードを取得する | メイン | 複数配置されたウィジェットでクリックに反応する »

2011年01月30日

Android:: 背景タイリングモードの適用

    

こんな感じの XML ファイルを drawable フォルダにおいて、これを android:background に設定すれば、背景に任意画像を単純拡大ではなく任意のタイリングモードで表示できる。

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
     android:src="@drawable/bg_image"
     android:antialias="false"
     android:dither="false"
     android:filter="false"
     android:gravity="top|center_horizontal"
     android:tileMode="clamp" />

通常の拡大は fit なので、縦横比が変わってしまう。
タイリングモードは、クランプやミラーなどテクスチャのラッピングモードとだいたい同じ。
背景に画像を置いて複数の解像度に対応する場合は、このタイリングモードを意識して背景画像を作った方が良い。
タイリングモードではなく、9-patch 形式の方が場合によっては扱いやすいかもしれない。
9-patch 形式は、画像の中で拡大する部分と等倍で表示する部分を指定して画像を引き延ばすための形式。

XML によるタイリングモードの指定は便利なのだが、Android 1.6 だとうまく適用されない場合がある。
どうも、Bitmap の density 周りがうまく適用出来てないようなのだが、あまり詳しくはソースコードを追っていない。
Android 2.1 なら、この不具合は解消されている。

Android 1.6 でこの不具合を回避するには、以下のようにレイアウト適用後1個1個関数を呼んで設定していけばよい。

setContentView(R.layout.main);
final Drawable drawable = getResources().getDrawable(R.drawable.bg_image);
if( drawable instanceof BitmapDrawable ) {
    final BitmapDrawable bmpDrawer = (BitmapDrawable)drawable;
    bmpDrawer.setGravity(Gravity.TOP|Gravity.CENTER_VERTICAL|Gravity.CLIP_HORIZONTAL|Gravity.CENTER_VERTICAL);
    bmpDrawer.setTileModeXY( TileMode.CLAMP, TileMode.CLAMP );
    bmpDrawer.setAntiAlias( false );
    bmpDrawer.setFilterBitmap( false );
    bmpDrawer.setDither( false );
    view.setBackgroundDrawable( bmpDrawer );
}

XML で設定出来るものをわざわざソースコードで設定するのは面倒だけれども、不具合のようなので仕方ない。
Android 2.1 以降を対象とするのなら気にしなくても構わない。



投稿者 Takenori : 2011年01月30日 21:53




comments powered by Disqus
Total : Today : Yesterday : なかのひと