Ответ 1
Создайте копию grass_bg.xml
для каждого используемого вами времени (т.е. grass_bg_2.xml
). Это помогло мне убедиться, что параметр tileMode
не был потерян, когда один и тот же фон используется повторно.
Я использовал следующий код для повторения изображения в фоновом режиме, но его работа не может помочь?
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"/>
показывает одно и то же маленькое изображение. его не повторяется...
Создайте копию grass_bg.xml
для каждого используемого вами времени (т.е. grass_bg_2.xml
). Это помогло мне убедиться, что параметр tileMode
не был потерян, когда один и тот же фон используется повторно.
Растровые изображения (и их состояния) многократно используются, и мне было легко потерять 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);
}
}
}
Я столкнулся с той же проблемой, но решил исследовать бит глубже. Причиной было то, что я все время замечал одну из моих растягиваемых работ, в то время как другая всегда была сломана. Трюк - это одно изображение, сделанное из другого, с минимальными изменениями в цветах и альфа. 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" />
Говорите, если у вас есть дополнительные заметки.
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...*/ }