2010-11-02 60 views
21

我已经使用下面的代码在后台重复图像,但它不工作可以帮助任何人?在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在绘制这个样子的

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

它显示了相同的小图像。它不重复...

+0

它适合我用您提供的代码,是在另一个布局的布局或什么? – SteD 2010-11-02 13:06:02

+0

https://maxalley.wordpress.com/2012/09/27/android-repeating-background-image/ – boctulus 2015-04-02 16:56:34

回答

9

每次使用时间(即grass_bg_2.xml)用于创建的grass_bg.xml副本。这对我来说确保tileMode设置在重复使用相同背景时不会丢失。

+1

嘿,我经历过类似的奇怪问题,需要重命名drawable才能解决。任何想法为什么这是这种情况? – 2011-11-13 02:00:46

+0

它只在Kindle上发生 – 2012-11-28 12:14:25

35

位图(及其状态)得到重用很多,我发现如果在多个位置使用BitmapDrawable,很容易失去tileMode。下面的代码解决了这个问题对我来说:

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

看来这个bug在Honeycomb中得到修复。这意味着只有姜饼和更早的时候才需要解决方法。 – Janusz 2012-05-02 07:41:24

+0

不幸的是,我仍然可以看到果冻豆的问题。但非常非常罕见。我不知道如何实际触发它。我只知道复杂的嵌套布局似乎对它有影响。无论如何,+1,因为这里的解决方案工作。非常感谢你! – tiguchi 2012-11-28 19:42:16

+0

@Janusz我刚刚在Honeycomb(3.2 Galaxy Tab)上遇到了这个问题,所以我只能说它只在Honeycomb和更早版本中需要 – 2013-05-15 07:54:54

6

我面临同样的问题,但决定深入调查一下。原因是我一直注意到我的可绘制作品中的一个,而另一个始终是坏的。诀窍在于一个图像是由另一个图像制成的,只需对颜色和alpha进行最小改变即可。除了参考PNG之外,Drawables的XML是相同的。所以我带着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" /> 

讲,如果你有任何进一步的说明。

0
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...*/ }