hyoromoのブログ

iOS/AndroidもしくはCocos2dxネタを書いています

タイル状に画像を敷き詰める


よくWebサイトであるような、小さな画像を背景にタイル状に敷き詰める方法。
xmlでの方法を書く人は居るのに、javaで書いてくれてる人が居ないので整理しておく。

XML指定での方法

res/drawable/icon_repeat.xml

ポイントはtileModerepeatに設定している事。

<?xml version="1.0" encoding="UTF-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:tileMode="repeat"
    android:src="@drawable/icon"
></bitmap>
res/layout/main.xml

先ほど定義したxmlを設定する。今回は手抜きで LinearLayout に定義してるが、ImageViewなどでも大丈夫。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/icon_repeat"
></LinearLayout>

Java指定での方法

ポイントは BitmapShader を使用して repeat 指定しているところ。

Shader shader = new BitmapShader(BitmapFactory.decodeResource(getResources(), R.drawable.icon), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
Paint paint = new Paint();
paint.setShader(shader);

Canvas canvas = getHolder().lockCanvas();
canvas.drawPaint(paint);
getHolder().unlockCanvasAndPost(canvas);

用途としてはCanvasで描く時にタイル状に並べたいケースが想定されるため、サンプルは上記のようにしています。
Widgetに対してならsetBackgroundが使えるから、XMLで指定してやりゃ良いと思う。