2010-11-02 41 views
21

Tôi đã sử dụng đoạn mã sau để lặp lại hình ảnh ở chế độ nền nhưng không hoạt động được bất kỳ hình nào có thể trợ giúp?hình nền không lặp lại trong bố cục 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 trong vẻ drawable như thế này

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

thấy nó ảnh nhỏ cùng. nó không lặp lại ...

+0

Nó hoạt động tốt cho tôi với mã bạn cung cấp, là bố cục trong bố cục khác hay gì đó? – SteD

+0

https://maxalley.wordpress.com/2012/09/27/android-repeating-background-image/ – boctulus

Trả lời

9

Tạo một bản sao của grass_bg.xml cho mỗi lần bạn sử dụng nó (tức là grass_bg_2.xml). Điều này làm việc cho tôi để đảm bảo các thiết lập tileMode đã không bị mất khi cùng một nền được sử dụng nhiều lần.

+1

Hey Tôi đã gặp phải những vấn đề kỳ quặc tương tự như yêu cầu đổi tên drawables để làm việc xung quanh. Bất kỳ ý tưởng tại sao đây là trường hợp? –

+0

Nó chỉ xảy ra với tôi trên Kindle –

35

Ảnh bitmap (và trạng thái của chúng) được tái sử dụng rất nhiều và tôi thấy dễ dàng mất tileMode nếu BitmapDrawable được sử dụng ở nhiều nơi. Các mã sau sửa chữa vấn đề đối với tôi:

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

Dường như lỗi này được sửa trong Honeycomb. Điều này có nghĩa là giải pháp thay thế chỉ cần thiết trong Gingerbread và trước đó. – Janusz

+0

Thật không may tôi vẫn có thể thấy vấn đề đó trên Jelly Bean. Nhưng rất hiếm khi. Tôi không biết làm thế nào để kích hoạt nó. Tôi chỉ biết rằng bố cục lồng nhau phức tạp dường như có ảnh hưởng đến nó. Dù sao, 1 vì giải pháp này ở đây hoạt động. Cảm ơn nhiều! – tiguchi

+0

@Janusz Tôi vừa gặp vấn đề này trên Honeycomb (3.2 Galaxy Tab) vì vậy tôi muốn nói rằng nó chỉ cần trong Honeycomb và trước đó là –

6

Tôi gặp vấn đề tương tự nhưng quyết định điều tra sâu hơn một chút. Nguyên nhân là tôi nhận thấy một trong những tác phẩm có thể vẽ của tôi mọi lúc, trong khi người kia luôn bị hỏng. Bí quyết là một hình ảnh được tạo ra từ hình ảnh khác chỉ với những thay đổi nhỏ về màu sắc và alpha. XML của bản vẽ giống hệt nhau bên cạnh tham chiếu đến PNG. Vì vậy, tôi đã pnginfo để xem những gì có.

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 

thức hoạt động của diagstripe_yellow.png, trong khi diagstripe_dark.png không, và nếu tôi thay thế tham chiếu đến nó với tham chiếu đến diagstripe_yellow.png, sau đó nó hoạt động (ít nhất là trên 2.2.1 tôi đã nhận ở đây) Vì vậy, sự khác biệt chính là:

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

Trước tiên hãy thử là để vô hiệu hóa xen kẽ, không có may mắn, ngay cả khi phần đầu trông giống nhau:

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 

Nếu có ai làm phiền để đào sâu hơn ở đây các tệp: http://webnetmobile.com/files/ hoặc sử dụng công cụ base64 để giải mã tệp từ các dấu ngoặc kép bên dưới:

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

Nói lên nếu bạn có bất kỳ ghi chú thêm.

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...*/ } 
Các vấn đề liên quan