Bordear un bitmap con esquinas redondeadas en Android

Usé el siguiente para hacer un bitmap con esquinas redondeadas. Ahora quiero dibujar una línea alrededor del bitmap.

private BitmapDrawable roundCornered(BitmapDrawable scaledBitmap, int i) { Bitmap bitmap = scaledBitmap.getBitmap(); result = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); canvas = new Canvas(result); color = 0xff424242; paint = new Paint(); rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); rectF = new RectF(rect); roundPx = i; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(Color.BLUE); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); BitmapDrawable finalresult = new BitmapDrawable(result); return finalresult; } 

Obtuve la imagen a continuación, pero mi necesidad real es que debo dibujar un borde alrededor de la imagen.

Reuní lo siguiente para mí.

 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int color, int cornerDips, int borderDips, Context context) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int borderSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) borderDips, context.getResources().getDisplayMetrics()); final int cornerSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) cornerDips, context.getResources().getDisplayMetrics()); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); // prepare canvas for transfer paint.setAntiAlias(true); paint.setColor(0xFFFFFFFF); paint.setStyle(Paint.Style.FILL); canvas.drawARGB(0, 0, 0, 0); canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint); // draw bitmap paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); // draw border paint.setColor(color); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth((float) borderSizePx); canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint); return output; } 

Créditos, por supuesto, a http://ruibm.com/?p=184

¿Qué tal si preparamos la imagen de 9 parches a continuación y la configuramos como fondo con android:background

enter image description here

Yo uso BitmapShader y drawRoundRect lo hago y funciona para mí, mira la captura de pantalla

enter image description here

 RectF roundRect; // the Rect you have to draw into Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // draw the border at bottom mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mBorderColor); canvas.drawRoundRect(roundRect, mRadius, mRadius, mPaint); // ------------------ draw scheme bitmap roundRect.set(itemRect.left + mBorderSize, itemRect.top + mBorderSize, itemRect.right - mBorderSize, itemRect.bottom - mBorderSize); Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint.setShader(shader); canvas.drawRoundRect(roundRect, mRadius, mRadius, mPaint); mPaint.setShader(null); 

Desafortunadamente, no existe un parámetro de “frontera” agradable y ordenado en Android, pero la forma más sencilla de hacerlo es incluirlo dentro de otro diseño, establecer el fondo del diseño principal en el color de borde / dibujable y luego establecer un relleno sobre él. El relleno aparecerá alrededor de su BitmapDrawable.

Hice muchas búsquedas para implementar ese efecto por código, antes de encontrar otra manera, pero no es lo suficientemente perfecto, puedes ver la irregularidad en cada esquina, establezco Paint.setAntiAlias ​​(true), Paint.setDither (true), Paint.setFilterBitmap (verdad), pero no funciona, entonces espero que alguien me pueda ayudar. enter image description here

 RectF roundRect = new RectF(itemRect); Bitmap bitmap = scheme.getSchemeBitmap(getResources()); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mSchemeSelectedColor); canvas.drawRoundRect(roundRect, mSchemeCornerRadius, mSchemeCornerRadius, mPaint); roundRect.set(itemRect.left + mBorderSize, itemRect.top + mBorderSize, itemRect.right - mBorderSize, itemRect.bottom - mBorderSize); Path clipPath = new Path(); clipPath.addRoundRect(roundRect, mSchemeCornerRadius, mSchemeCornerRadius, Path.Direction.CW); canvas.save(Canvas.CLIP_SAVE_FLAG); canvas.clipPath(clipPath); canvas.drawBitmap(bitmap, null, roundRect, mPaint); canvas.restre(); 

mi manera:

  public static Bitmap getRoundedCornerBitmap1(Bitmap bitmap, int color, int cornerDips, int borderDips) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+2*borderDips, bitmap.getHeight()+2*borderDips, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawColor(Color.TRANSPARENT); final RectF rectF = new RectF(0, 0, output.getWidth(), output.getHeight()); final Paint paint = new Paint(); // prepare canvas for transfer paint.setAntiAlias(true); paint.setStrokeWidth((float) borderDips); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.FILL); canvas.drawRoundRect(rectF, borderDips, borderDips, paint); canvas.drawBitmap(bitmap, borderDips, borderDips, null); bitmap.recycle(); return output; } 

Resultado

enter image description here