2011-09-16 18 views
7

Tengo una imagen que estoy usando como fondo para un RelativeLayout. La imagen debe ser en mosaico horizontal para hacer un patrón.Hacer mosaico dibujable en mapa de bits en x pero estirar en y

soy capaz de obtener la imagen en mosaico horizontal mediante el uso de este código:

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

b3.setTileModeX(Shader.TileMode.REPEAT); 

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

El problema es que la imagen también azulejos verticalmente. Parece formar mosaicos en el modo "abrazadera" en el modo vertical, pero el modo "repetir" en el horizontal. Aquí está una captura de pantalla:

TileMode

Como se puede ver, la imagen es sólo un poco menor que el espacio que ocupa, y el borde inferior es "apretada".

¿Cómo puedo configurar la imagen para que se extienda verticalmente pero que se lame horizontalmente?

Respuesta

5

Este método invoca creación del nuevo mapa de bits, pero parece que está acrhiving su objetivo

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

Tenga en cuenta que sólo funciona si la vista ya estaba layouted, por lo que un Lile método onWindowFocusChanged es un buen lugar para este código .

+0

es posible hacer que sólo mediante la combinación de dibujables de XML? – neworld

0

Tengo el mismo problema yo mismo. Intentó usar la imagen 9patch, pero parece que no puede usar 9 imágenes de parches junto con el mosaico, el parche 9 estira la imagen independientemente de lo que defina en la propiedad de mosaico. Al final lo que haré es pedirle al creador de la imagen que lo estire verticalmente o lo haga yo mismo. Me encantaría una solución mejor si alguien encuentra una.

2

siento que es sencillo: (Este código de baldosas en Y y repetir en x)

En su onWindowFoucsChanged llame:

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

demasiado tarde para usted, pero puede ser útil para otros.

Puede crear una vista personalizada para hacer esto. Simplemente la escala de su mapa de bits fuente para ser tan alto como su punto de vista y luego dibujar varias veces en el lienzo:

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(); 
    } 
} 
} 
Cuestiones relacionadas