2012-01-12 36 views
10

Tôi có một bitmap lát gạch mà tôi đang sử dụng làm nền View. Ví dụ: View, có android:layout_height="wrap_content". Vấn đề là chiều cao của bitmap được sử dụng trong nền đang tham gia đo lường chế độ xem, tăng chiều cao View. Điều này có thể được nhận thấy khi kích thước nội dung của View nhỏ hơn chiều cao của bitmap được sử dụng làm nền lát.Nền lát gạch đang đẩy kích thước Xem của nó

Hãy để tôi chỉ cho bạn một ví dụ. Bitmap ngói:

enter image description here

bitmap drawable (tile_bg.xml):

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

Cách bố trí:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#FFFFFF"> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/tile_bg" 
     android:text="@string/hello" 
     android:textColor="#000000" /> 

</LinearLayout> 

Làm thế nào nó trông giống như:

enter image description here

Chiều cao của TextView kết thúc bằng chiều cao của bitmap. Những gì tôi đã mong đợi là bitmap được cắt bớt theo kích thước của View.

Có cách nào để đạt được điều này không?

Ghi chú:

  • tôi không thể sử dụng 9patch drawables kể từ khi nền cần phải được lặp đi lặp lại một cách gạch thời trang, kéo dài không phải là một lựa chọn.
  • tôi không thể thiết lập chiều cao cố định cho View, nó phụ thuộc của trẻ em (Tôi đang sử dụng điều này trong một ViewGroup)
  • hành vi kỳ lạ này xảy ra như tôi đã giải thích trước khi kích thước của View nhỏ hơn kích thước của bitmap, nếu không bitmap được lặp lại một cách chính xác (ví dụ, nếu kích thước xem là 1,5x kích thước của bitmap, bạn sẽ thấy 1,5 lần bitmap).
  • Ví dụ đề cập đến chiều cao, nhưng giống với chiều rộng.

Trả lời

14

Bạn cần bitmapDrawable tùy chỉnh trả về 0 từ getMinimumHeight() và getMinimumWidth(). Dưới đây là một tôi đã đặt tên BitmapDrawableNoMinimumSize mà không được công việc:

import android.content.res.Resources; 
import android.graphics.drawable.BitmapDrawable; 

public class BitmapDrawableNoMinimumSize extends BitmapDrawable { 

    public BitmapDrawableNoMinimumSize(Resources res, int resId) { 
     super(res, ((BitmapDrawable)res.getDrawable(resId)).getBitmap()); 
    } 

    @Override 
    public int getMinimumHeight() { 
     return 0; 
    } 
    @Override 
    public int getMinimumWidth() { 
     return 0; 
    } 
} 

Tất nhiên bạn không thể (AFAIK) khai báo drawables tùy chỉnh trong XML, vì vậy bạn phải nhanh chóng và thiết lập nền của TextView thusly:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    BitmapDrawable bmpd =new BitmapDrawableNoMinimumSize(getResources(), R.drawable.tile); 
    bmpd.setTileModeX(TileMode.REPEAT); 
    bmpd.setTileModeY(TileMode.REPEAT); 
    findViewById(R.id.textView).setBackgroundDrawable(bmpd); 
} 

và dĩ nhiên bạn loại bỏ các thuộc tính nền từ xml bố trí:

<TextView 
    android:id="@+id/textView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Testing testing testing" 
    android:textColor="#000000" /> 

tôi đã thử nghiệm này và có vẻ như để làm việc.

+0

Câu trả lời hay, cảm ơn! – aromero

Các vấn đề liên quan