Pytanie Rysunki w tle określają rozmiar widoku


W trosce o jasność pytanie to zostało znacznie zmienione.

Załóżmy, że mam zasób .png o wielkości 100 x 100 pikseli:
enter image description here

Chcę użyć tego obrazu jako tła dla mojego TextViews, którego rozmiar jest określony przez jego zawartość, która jest zmienna w czasie wykonywania. Zwłaszcza, chcę, aby ten obraz ułożył się, gdy TextView rozmiar jest większy niż 100x100px, i chcę go przyciąć, gdy TextView jest mniejsze niż 100x100px.

Ten ostatni wydaje się trudny.

Przykładowy kod

Mam zasób do rysowania bg_tile.xml:

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

Mój plik układu:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:background="@drawable/bg_tile"
        android:text="Short text"
        android:textSize="20sp" />

    <TextView android:layout_margin="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bg_tile"
        android:text="Long text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long text "
        android:textSize="20sp" />

</LinearLayout>

Co się dzieje

Oto zrzut ekranu wyniku tego kodu i jedno z tego, czego mógłbym się spodziewać / czego chcę: enter image description here

Jak widać, część kafelkowa działa, a dolna płytka jest odcinana. Jednakże, gdy TextView jest mniejszy niż tło, TextView przyjmuje rozmiar tła.

Sugerowane rozwiązania

  • android:gravity="clip_vertical|clip_horizontal" - To nie działa, nawet bez tilemode.
  • Posługiwać się match_parent jako parametry układu - nie jest opcją.
  • Ustawienie stałej wysokości - Nie ma sposobu, aby powiedzieć, jak długo zawartość TextView będzie, a wraz z nim jego rozmiar.

Jak mogę osiągnąć mój cel?


16
2018-02-20 09:48


pochodzenie


naprawić height Twojego View : android:layout_height="75dp" , I użyć android:scaleType="centerCrop" lub centerInside - Houcine
Nie jest to możliwe, ponieważ widok może być TextView z wieloma liniami tekstu. - nhaarman
dodaj swój kod i określ typ swoich widoków, dla których chcesz ustawić tło - Houcine
To nie powinno mieć znaczenia, używam różnych rodzajów Views z dynamicznymi rozmiarami. - nhaarman


Odpowiedzi:


Nie próbowałem tego sam, ale możesz spróbować tego pomysłu / hack / obejścia:

Minimalna wysokość / szerokość widoku (TextView) jest określona przez jego tło (między innymi). Używa on tła DrawMinimumHeight () i getMinimumWidth () do określenia minimalnej wysokości i szerokości widoku.

Wygląda na to, że minimalna wysokość i szerokość widoku ma wynosić 0 (bez wypełnienia), a szerokość / wysokość widoku powinna być oparta tylko na zawartości widoku (w twoim przypadku tekst TextView).

Spróbuj tego w onCreate Twojej Aktywności lub onCreateView Twojego Fragmentu, gdzie otrzymujesz blokadę TextView, którą próbujesz "naprawić". Nazwijmy to "tv" w TextView:

TextView tv; 
...
...
tv = (TextView)...findViewById(...);
....

// Swap the 'standard' bitmap background with one that has no minimum width/height.
BitmapDrawable background = (BitmapDrawable)tv.getBackground(); // assuming you have bg_tile as background.
BitmapDrawable newBackground = new BitmapDrawable(background.getBitmap) {
    @Override
    public int getMinimumWidth() {
        return 0;
    }

    @Override
    public int getMinimumHeight() {
        return 0;
    }
};
newBackground.setTileModeXY(background.getTileModeX(), background.getTileModeY());
tv.setBackgroundDrawable(newBackground);
...
...

13
2018-02-25 17:55



Dzięki za wkład! Chociaż to powoduje, że mój rozmiar jest odpowiedni TextView, obraz jest zmniejszany i rozciągany, aby pasował. - nhaarman
Spróbuj wywołać newBackground.setTileModeXY (background.getTileModeX (), background.getTimeModeY ()); przed wywołaniem tv.setBackgroundDrawable ... - Streets Of Boston
Dzięki, to działa! Chociaż używa nieaktualnych metod, ale znajdę sposób, aby to naprawić. - nhaarman
Tak, "setBackgroundDrawable" jest przestarzałe, ale jeśli twój kod musi działać na poziomie API 15 lub niższym, nie można użyć metody "setBackground" .... - Streets Of Boston
Doskonałe, bardzo przebiegłe rozwiązanie. - Ian Newson


Zgaduję, że twój problem jest tutaj:

android: layout_width = "wrap_content" android: layout_height = "wrap_content"

Ustawia szerokość, aby zawinąć zawartość, a zawartość zawiera obraz tła. Nie jestem pewien, jaki jest kontekst twojego widoku, ale jeśli możesz po prostu ustawić wysokość z kodu lub z pliku xml, twój problem powinien zniknąć. Możesz również dodać android: scaleType = "centerCrop" lub centerInside jako Houcine wymienione, jeśli tło nadal nie wyświetla się zgodnie z twoimi upodobaniami.

Jeśli powiesz nam kontekst tych niejasnych poglądów, prawdopodobnie będziemy mogli podać Ci więcej informacji.


0
2018-02-22 22:48





Zawsze możesz użyć:

android:layout_width="match_parent"
android:layout_height="match_parent"

0
2018-02-22 23:12



To nie jest to, czego wymaga mój układ. - nhaarman


Spróbuj tego:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/bg_light"
    android:tileMode="repeat"
    android:gravity="clip_vertical|clip_horizontal" />

Dodatkowe opcje: http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap

Edycja: czytam dokumentację, to nie zadziała z zestawem tileMode:

android:tileMode

Keyword. Defines the tile mode. When the tile mode is enabled, the bitmap is repeated. Gravity is ignored when the tile mode is enabled.

Jeśli znasz rozmiar Widoku z wyprzedzeniem i wiesz, że klip został przycięty, możesz mieć jeden Bitmap-XML dla tileMode i inny dla grawitacji, a następnie użyć odpowiedniego. Niestety nie jest idealny.


0
2018-02-24 02:42