Подтвердить что ты не робот

Фоновое изображение не повторяется в макете android

Я использовал следующий код для повторения изображения в фоновом режиме, но его работа не может помочь?

layout.xml

<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/grass_bg"
    >

grass_bg.xml в drawable выглядит следующим образом

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

показывает одно и то же маленькое изображение. его не повторяется...

4b9b3361

Ответ 1

Создайте копию grass_bg.xml для каждого используемого вами времени (т.е. grass_bg_2.xml). Это помогло мне убедиться, что параметр tileMode не был потерян, когда один и тот же фон используется повторно.

Ответ 2

Растровые изображения (и их состояния) многократно используются, и мне было легко потерять tileMode, если BitmapDrawable используется в нескольких местах. Следующий код исправляет проблему для меня:

 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);
           }
      }
 }

Ответ 3

Я столкнулся с той же проблемой, но решил исследовать бит глубже. Причиной было то, что я все время замечал одну из моих растягиваемых работ, в то время как другая всегда была сломана. Трюк - это одно изображение, сделанное из другого, с минимальными изменениями в цветах и ​​альфа. XML-чертежи идентичны вместе со ссылкой на PNG. Поэтому я взял pnginfo, чтобы посмотреть, что там.

diagstripe_dark.png:

Image Width: 18 Image Length: 30
Bitdepth (Bits/Sample): 8
Channels (Samples/Pixel): 3
Pixel depth (Pixel Depth): 24
Colour Type (Photometric Interpretation): RGB
Image filter: Single row per byte filter
Interlacing: Adam7 interlacing
Compression Scheme: Deflate method 8, 32k window
Resolution: 2835, 2835 (pixels per meter)
FillOrder: msb-to-lsb
Byte Order: Network (Big Endian)
Number of text strings: 0 of 0

diagstripe_yellow.png:

Image Width: 18 Image Length: 30
Bitdepth (Bits/Sample): 8
Channels (Samples/Pixel): 4
Pixel depth (Pixel Depth): 32
Colour Type (Photometric Interpretation): RGB with alpha channel
Image filter: Single row per byte filter
Interlacing: No interlacing
Compression Scheme: Deflate method 8, 32k window
Resolution: 2835, 2835 (pixels per meter)
FillOrder: msb-to-lsb
Byte Order: Network (Big Endian)
Number of text strings: 0 of 0

работает diagstripe_yellow.png, а diagstripe_dark.png - нет, и если я заменяю ссылки на него ссылкой на diagstripe_yellow.png, то он работает (по крайней мере, на 2.2.1 я получил здесь). Таким образом, основные отличия:

Channels (Samples/Pixel):
Pixel depth (Pixel Depth):
Colour Type (Photometric Interpretation):
Interlacing:

Первая попытка состояла в том, чтобы отключить переплетение, без везения, даже когда заголовок выглядит таким же:

diagstripe_dark-2.png:

Image Width: 18 Image Length: 30
Bitdepth (Bits/Sample): 8
Channels (Samples/Pixel): 4
Pixel depth (Pixel Depth): 32
Colour Type (Photometric Interpretation): RGB with alpha channel
Image filter: Single row per byte filter
Interlacing: No interlacing
Compression Scheme: Deflate method 8, 32k window
Resolution: 0, 0 (unit unknown)
FillOrder: msb-to-lsb
Byte Order: Network (Big Endian)
Number of text strings: 0 of 0

Если кто-то захочет копать глубже, вот файлы: http://webnetmobile.com/files/ или использовать инструмент base64 для декодирования файлов из приведенных ниже кавычек:

diagstripe_yellow.png:

iVBORw0KGgoAAAANSUhEUgAAABIAAAAeCAYAAAAhDE4sAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL
EwAACxMBAJqcGAAAAAd0SU1FB9wCEg8JKbHU3pgAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQg
d2l0aCBHSU1QZC5lBwAAAE5JREFUSMdj7OnpqWdgYGCQft3S8FS0poFcNhM1DHkqWtPAuLxc4D+l
hjAwMDAwWwa2MIx6bdRro14b9dqo10a9Nuo1Gnstj4GBQYgSAwG9j8m8FwE2EgAAAABJRU5ErkJg
gg==

diagstripe_dark.png:

iVBORw0KGgoAAAANSUhEUgAAABIAAAAeCAIAAAHZaentAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL
EwAACxMBAJqcGAAAAAd0SU1FB9wCDww0GV3Ql5EAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQg
d2l0aCBHSU1QZC5lBwAAAGVJREFUOMvtkjsSgCAMRFfvfwOiV30WMCBqKFJIQ8XO/tgiAo6UAOUH
2ABJp5mqWri98B3ZXBmoogx0F4GX3w3LrQnZHju61Cfb6j15RqebG/23On/tHMiRkwheyxq5Rs4Z
aRZIXsBYcInPMeOmAAAAAElFTkSuQmCC

stripes.xml:

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

Говорите, если у вас есть дополнительные заметки.

Ответ 4

    try{ BitmapDrawable background = (BitmapDrawable) myView.getBackground();
    background.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); }
    catch(Exception e) { /*Do nothing; background is not BitmapDrawable; can be a color or null...*/ }