Repetición de mapa de bits + esquinas redondeadas

Estoy intentando crear el rectángulo con las esquinas redondeadas y el fondo como mapas de bits repetidos. Estoy escribiendo así, pero obteniendo bitmaps en las esquinas.

¿Podría alguien ayudar?

Background.xml

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <stroke android:width="1dp" android:color="#FFFFFF" /> <corners android:radius="50dp" /> </shape> </item> <item> <bitmap android:src="@drawable/carbon_4" android:tileMode="repeat" /> </item> </layer-list> 

Como entiendo el objetivo: tener una imagen de fondo con baldosas curvas curvas. Azulejos y curvas

No es muy pixel perfecto, pero es lo más cerca que puedo conseguir.

Primero, aquí hay algunos diseños que estoy usando para dibujar ese botón

The_button.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/wrapper_main" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/bg_curved_tiled" android:padding="20dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Some Text" /> </FrameLayout> 

Y eso es usar esto como su fondo

Bg_curved_tiled.xml

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@id/layer_needs_rounding"> <bitmap android:src="@drawable/patch" android:tileMode="repeat" /> </item> <item> <shape android:shape="rectangle" android:useLevel="false" > <stroke android:width="3dp" android:color="#666666" /> <solid android:color="@null" /> <corners android:bottomLeftRadius="@dimen/radius_corner_default" android:bottomRightRadius="@dimen/radius_corner_default" android:radius="@dimen/radius_corner_default" android:topLeftRadius="@dimen/radius_corner_default" android:topRightRadius="@dimen/radius_corner_default" /> </shape> </item> </layer-list> 

En este punto, usted tiene una imagen que se parece a esto

Introduzca aquí la descripción de la imagen

Como se puede ver, el mapa de bits de mosaico sobresale en las esquinas más allá de la forma curvada que se superpone en la parte superior de la misma.

Así que ahora usted necesita una función que rodea las esquinas de un mapa de bits … tengo este en algún otro lugar en stackoverflow

  public static Bitmap createRoundedCornerBitmap(Context context, Bitmap input, float roundPx, boolean squareTL, boolean squareTR, boolean squareBR, boolean squareBL) { if (input == null) { return null; } final int w = input.getWidth(), h = input.getHeight(); Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, w, h); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); // draw rectangles over the corners we want to be square if (squareTL) { canvas.drawRect(0, 0, w / 2, h / 2, paint); } if (squareTR) { canvas.drawRect(w / 2, 0, w, h / 2, paint); } if (squareBL) { canvas.drawRect(0, h / 2, w / 2, h, paint); } if (squareBR) { canvas.drawRect(w / 2, h / 2, w, h, paint); } paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(input, 0, 0, paint); return output; } 

¡Casi allí! Odio esta parte – no he encontrado ninguna manera mejor de conseguir el objeto del mapa de bits que tiene el mapa de bits en mosaico real en él. Por ejemplo, BitmapDrawable.getBitmap sólo le da el mapa de bits de parche individual, no el mosaico repetido patch canvas … bummer. Así que en su lugar, estoy recibiendo la caché de dibujo de la vista. Usted necesita cerciorarse de que la visión se haya inicializado totalmente primero (la altura y el ancho se han calculado y embaldosado apropiadamente), así que post a la visión y hacer el proceso allí.

 private void shaveOffCorners(final ViewGroup view) { view.post(new Runnable() { @Override public void run() { // make all child views invisible before scraping the drawing cache SparseIntArray viewStates = new SparseIntArray(); for(int index = 0; index < view.getChildCount(); ++index) { View child = view.getChildAt(index); viewStates.put(index, child.getVisibility()); child.setVisibility(View.INVISIBLE); } view.buildDrawingCache(); // this is the exact bitmap that is currently rendered to screen. hence, we wanted to // hide all the children so that they don't permanently become part of the background final Bitmap rounded = view.getDrawingCache(); // restore actual visibility states after getting the drawing cache for(int index = 0; index < view.getChildCount(); ++index) { View child = view.getChildAt(index); child.setVisibility(viewStates.get(index)); } view.setBackgroundDrawable(new BitmapDrawable( getResources(), MyImageUtil.createRoundedCornerBitmap( view.getContext(), rounded, getResources().getDimensionPixelSize(R.dimen.radius_corner_default), false, true, true, false))); } }); } 

Y así lo hice, espero que ayude!

Si alguien conoce una forma menos horrible de lograr esto, por favor comparta. También si alguien sabe cómo obtener el mapa de bits de mosaico que no sea el raspado de la caché de dibujo, sería útil también – todo el ocultamiento y la restauración de las vistas de los niños es un poco janky.

Encontré este post de Romain Guy que es una manera mucho más fácil de redondear esquinas en un mapa de bits de mosaico. Aquí está la respuesta corta:

 class CurvedAndTiled extends Drawable { private final float mCornerRadius; private final RectF mRect = new RectF(); private final BitmapShader mBitmapShader; private final Paint mTilePaint; CurvedAndTiled( Bitmap bitmap, float cornerRadius) { mCornerRadius = cornerRadius; mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); mTilePaint = new Paint(); mTilePaint.setAntiAlias(true); mTilePaint.setShader(mBitmapShader); } @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mRect.set(0, 0, bounds.width(), bounds.height()); } @Override public void draw(Canvas canvas) { canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mTilePaint); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public void setAlpha(int alpha) { mTilePaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { mTilePaint.setColorFilter(cf); } } 

Usted acaba de establecer el fondo de su vista es dibujable para ser uno de estos chicos y su bien para ir.

  • Tratamiento de mapas de bits grandes (mosaico de un pequeño mapa de bits para crear papel tapiz)
  • Android, Blur Bitmap al instante?
  • Recortar mapa de bits sin leer todo el mapa de bits primero
  • Uso de Fresco de Facebook para cargar un mapa de bits
  • Cómo tomar una foto, guardarla y obtener la foto en Android
  • Android: ¿Cuál es la forma más rápida de cargar varios mapas de bits / pulgares a través de http?
  • ¿Mejor velocidad de cuadro que dibuja los mapas de bits en una lona?
  • Convertir un lienzo en imagen de mapa de bits en android
  • Android: Obtención de un mapa de bits desde una conexión de url (graph.facebook.com) que redirige a otra url
  • ¿Cómo puedo modificar un mapa de bits de Android en el NDK para que pueda utilizarlo en Java?
  • Convertir la textura procesada de OpenGL ES 2.0 en mapa de bits y volver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.