2011-09-16 11 views
7

Mam obraz, który używam jako tło dla RelativeLayout. Obraz musi być układany poziomo, aby utworzyć wzór.Utwórz bitmapę do rysowania w x, ale rozciągnij y

jestem w stanie uzyskać obraz do płytki poziomo za pomocą tego kodu:

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

b3.setTileModeX(Shader.TileMode.REPEAT); 

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

Problem polega na tym, że obraz rozmieszcza także w pionie. Wydaje się, że płytki w trybie "zacisk" w pionie, ale "powtórzyć" tryb w poziomie. Oto zrzut ekranu:

TileMode

Jak widać, obraz jest tylko trochę mniejsza niż zajmowaną powierzchnię, a dolna krawędź jest „zakleszczony”.

Jak ustawić obraz, aby rozciągał się w pionie, ale był poziomo?

Odpowiedz

5

Metoda ta wywołuje tworzenie nowej bitmapy ale wygląda na to acrhiving swój cel

 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); 

Należy pamiętać, że to działa tylko wtedy, gdy widok został już layouted, więc metoda lile onWindowFocusChanged jest dobrym miejscem dla tego kodu .

+0

Czy można to zrobić tylko łącząc rysunki XML? – neworld

0

Sam mam ten sam problem. Próbowano użyć obrazu 9-stronnego, ale wydaje się, że nie można używać obrazów z 9-stronnymi obrazkami ani z kafelkami, a 9-stronicowa rozkłada obraz bez względu na to, co zdefiniowano w właściwości kafelkowania. Na koniec postaram się poprosić twórcę obrazu o rozciągnięcie go w pionie lub zrobić to sam. Chciałbym znaleźć lepsze rozwiązanie, jeśli ktoś je znajdzie.

2

czuję to jest prosta: (Kod ten będzie dachówka w Y i powtórzyć w X)

w twojej onWindowFoucsChanged zadzwonić:

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

Zbyt późno dla ciebie, ale może być przydatny dla innych.

Możesz utworzyć niestandardowy widok, aby to zrobić. Po prostu przeskaluj swoją bitmapę źródłową tak, aby była jak najwyższa widoczność, a następnie narysuj ją wielokrotnie na płótnie:

public class RepeatingXImageView extends View { 

Bitmap bitmap; 
Paint paint; 

public RepeatingXImageView(Context context) { 
    super(context); 
} 

public RepeatingXImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public RepeatingXImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    if(changed) { 
     paint = new Paint(); 
     bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.seekbar_overlay); 
     bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bottom - top, false); 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if(bitmap == null) return; 
    int left = 0; 
    while(left < getWidth()) { 
     canvas.drawBitmap(bitmap, left, 0, paint); 
     left += bitmap.getWidth(); 
    } 
} 
} 
Powiązane problemy