2012-01-12 12 views
10

Mam kafelkową mapę bitową, której używam jako tło View. Ta View, powiedzmy, ma android:layout_height="wrap_content". Problem polega na tym, że wysokość mapy bitowej wykorzystywanej w tle bierze udział w pomiarze widoku, podnosząc wysokość o View. Można to zauważyć, gdy rozmiar zawartości View jest mniejszy niż wysokość mapy bitowej używanej jako tło kafelka.Wyłożone kafelkami tło pcha jego rozmiar Rozmiar:

Pozwól, że pokażę ci przykład. Dachówka bitmap:

enter image description here

odkształcalne bitmapy (tile_bg.xml):

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/tile" 
    android:tileMode="repeat"/> 

Układ:

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

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/tile_bg" 
     android:text="@string/hello" 
     android:textColor="#000000" /> 

</LinearLayout> 

Jak to wygląda:

enter image description here

Wysokość TextView kończy się wysokością bitmapy. Spodziewałem się, że bitmapa zostanie przycięta do rozmiaru View.

Czy jest jakiś sposób, aby to osiągnąć?

Uwagi:

  • Nie mogę korzystać 9patch kanału alfa, ponieważ tło musi być powtarzany w sposób płytki mody, rozciągając nie jest rozwiązaniem.
  • Nie mogę ustawić stałą wysokość dla View, to zależy od dzieci (używam tego w ViewGroup)
  • To dziwne zachowanie się dzieje jak wyjaśniono wcześniej, gdy wielkość jest mniejsza niż View rozmiar mapy bitowej, w przeciwnym razie mapa bitowa jest powtarzana poprawnie (tzn. jeśli rozmiar widoku jest 1,5x większy niż rozmiar mapy bitowej, kończy się widzenie 1,5 raza bitmapy).
  • Przykład dotyczy wysokości, ale jest taki sam przy użyciu szerokości.

Odpowiedz

14

Potrzebujesz niestandardowej BitmapDrawable, która zwraca 0 z getMinimumHeight() i getMinimumWidth(). Oto jeden mam nazwany BitmapDrawableNoMinimumSize który spełnia swoje zadanie:

import android.content.res.Resources; 
import android.graphics.drawable.BitmapDrawable; 

public class BitmapDrawableNoMinimumSize extends BitmapDrawable { 

    public BitmapDrawableNoMinimumSize(Resources res, int resId) { 
     super(res, ((BitmapDrawable)res.getDrawable(resId)).getBitmap()); 
    } 

    @Override 
    public int getMinimumHeight() { 
     return 0; 
    } 
    @Override 
    public int getMinimumWidth() { 
     return 0; 
    } 
} 

Oczywiście nie można (AFAIK) oświadczam niestandardowych kanału alfa w formacie XML, więc trzeba instancję i ustawić tle TextView za thusly:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    BitmapDrawable bmpd =new BitmapDrawableNoMinimumSize(getResources(), R.drawable.tile); 
    bmpd.setTileModeX(TileMode.REPEAT); 
    bmpd.setTileModeY(TileMode.REPEAT); 
    findViewById(R.id.textView).setBackgroundDrawable(bmpd); 
} 

i oczywiście usunąć atrybut tła z xml układ:

<TextView 
    android:id="@+id/textView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Testing testing testing" 
    android:textColor="#000000" /> 

Przetestowałem to i wydaje się działać.

+0

Doskonała odpowiedź, dzięki! – aromero

Powiązane problemy