Repeated Bitmap not working (stretched) on Android 2.3 (Gingerbread)

Problem

Jadi kejadiannya adalah saat saya membuat pattern untuk background image aplikasi dengan cara kayak gini (background.xml):

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/bg_pattern"
    android:tileMode="repeat" />

dimana bg_pattern ini image png yang ingin di repeat buat jadi background screen. kemudian saya set background ini di layout fragment yang saya gunakan kurang lebih kayak gini:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background">

    <!--Views banyak di sini-->

</FrameLayout>

it work great di device dengan Android OS versi 3 (Honeycomb) dan yang lebih baru, tapi masalah muncul saat saya test di device dengan OS versi 2.3 (saat test dengan galaxy ace, OS 2.3), gambar background bukannya di repeat malah ke stretch. Setelah googling sebentar, ternyata ini memang bugs di android OS.

Solution

Untungnya, ada workaround untuk kasus kayak gini, caranya adalah selalu mem-force repeat background di program. jadi, saya membuat sebuah static function di kelas statis saya (ie. AndroidUtils):

/***
	 * fix stretched image (bug on android  < 3)
	 * @param view view within which background image doesn't repeat correctly (stretched)
	 */
	public static void fixBackgroundRepeat(View view) {
	    Drawable bg = view.getBackground();
	    if (bg != null) {
	        if (bg instanceof BitmapDrawable) {
	            BitmapDrawable bmp = (BitmapDrawable) bg;
	            bmp.mutate(); // make sure that we aren't sharing state anymore
	            bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
	        }
	    }
	}

dan di setiap fragment dengan background repeated bitmap, saat create view-nya saya memanggil fungsi tersebut:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_layout, container, false);

		// make sure, background image repeated properly
		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){
			AndroidUtils.fixBackgroundRepeat(view);
		}
		return view;
	}

sejauh ini cara ini bisa menyelesaikan masalah yang saya temui.
jika punya cara lain, silahkan di share di comment :)

happy coding.

daftar cara yang mungkin bisa di coba:

  1. Pastiin image pattern berukuran bilangan pangkat dua (misal. 16x16px, 32x32px, dst)

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s