2011-09-16 4 views
7

Tôi có một hình ảnh mà tôi đang sử dụng làm nền cho RelativeLayout. Hình ảnh cần được lát gạch theo chiều ngang để tạo hình.Tạo hình bitmap có thể vẽ trong x nhưng kéo dài trong y

Tôi có thể để có được những hình ảnh để gạch ngang bằng cách sử dụng mã này:

BitmapDrawable b3 = (BitmapDrawable)getResources().getDrawable(R.drawable.background); 

b3.setTileModeX(Shader.TileMode.REPEAT); 

v.findViewById(R.id.layout).setBackgroundDrawable(b3); 

Vấn đề là hình ảnh cũng trải rộng theo chiều dọc. Có vẻ như xếp ở chế độ "kẹp" ở chế độ dọc, nhưng "lặp lại" ở chế độ nằm ngang. Đây là một ảnh chụp màn hình:

TileMode

Như bạn thấy, hình ảnh nhỏ hơn không gian nó chiếm chỉ là một chút, và cạnh đáy là "kẹp".

Tôi làm cách nào để đặt hình ảnh có thể kéo dọc theo chiều dọc nhưng lát theo chiều ngang?

Trả lời

5

Phương pháp này gọi tạo bitmap mới nhưng có vẻ như nó acrhiving mục tiêu của bạn

 View view = findViewById(R.id.layout); 
     BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(R.drawable.tile); 
     int width = view.getWidth(); 
     int intrinsicHeight = bd.getIntrinsicHeight(); 
     Rect bounds = new Rect(0,0,width,intrinsicHeight); 
     bd.setTileModeX(TileMode.REPEAT); 
     bd.setBounds(bounds); 
     Bitmap bitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), bd.getBitmap().getConfig()); 
     Canvas canvas = new Canvas(bitmap); 
     bd.draw(canvas); 
     BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap); 
     view.setBackgroundDrawable(bitmapDrawable); 

Xin lưu ý rằng nó chỉ hoạt động nếu xem đã được layouted, do đó, một phương pháp lile onWindowFocusChanged là một nơi tốt cho mã này .

+0

Chỉ có thể thực hiện điều đó bằng cách kết hợp các ký hiệu XML? – neworld

0

Tự mình gặp phải vấn đề tương tự. Đã thử sử dụng hình ảnh 9patch nhưng có vẻ như bạn không thể sử dụng hình ảnh 9patch cùng với ốp lát, 9patch kéo dài hình ảnh bất kể bạn định nghĩa gì trong thuộc tính ốp lát. Vào cuối những gì tôi sẽ làm là yêu cầu tác giả của hình ảnh để kéo dài theo chiều dọc hoặc tự mình làm. Tôi rất thích một giải pháp tốt hơn nếu có ai tìm thấy.

2

Tôi cảm thấy đó là thẳng về phía trước: (Mã này sẽ ngói trong Y và lặp lại trong x)

Trong bạn onWindowFoucsChanged bạn gọi:

public void onWindowFocusChanged(boolean hasFocus) { 
     // TODO Auto-generated method stub 
     super.onWindowFocusChanged(hasFocus); 
     Drawable d = getRepeatingBG(this, R.drawable.image_that_you_want_to_repeat); 
     body_view.setBackgroundDrawable(d); 

    } 

private Drawable getRepeatingBG(Activity activity, int center) 
    { 

     DisplayMetrics dm = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(dm); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inScaled=true; 

     Bitmap center_bmp = BitmapFactory.decodeResource(activity.getResources(), center, options); 
     center_bmp.setDensity(Bitmap.DENSITY_NONE); 
     center_bmp=Bitmap.createScaledBitmap(center_bmp, dm.widthPixels , center_bmp.getHeight(), true); 

     BitmapDrawable center_drawable = new BitmapDrawable(activity.getResources(),center_bmp); 
//change here setTileModeY to setTileModeX if you want to repear in X 
     center_drawable.setTileModeY(Shader.TileMode.REPEAT); 

     return center_drawable; 
    } 
1

Viễn quá muộn cho bạn, nhưng có thể hữu ích cho người khác.

Bạn có thể tạo Chế độ xem tùy chỉnh để thực hiện việc này. Chỉ cần chia tỷ lệ bitmap nguồn của bạn thành cao như chế độ xem của bạn và sau đó vẽ lại nhiều lần trên canvas: