2012-06-13 28 views
17

Utilicé lo siguiente para hacer un mapa de bits con esquinas redondeadas. Ahora quiero dibujar una línea alrededor del mapa de bits.Borde sobre un mapa de bits con esquinas redondeadas en Android

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.

+1

http://stackoverflow.com/questions/3263611/border-for-an-image- view-in-android – Andy

Respuesta

40

pongo el siguiente juntos por mí mismo.

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

0

Desafortunadamente no hay parámetro agradable y limpio "frontera" en Android, pero la forma más sencilla de hacerlo es para revestir que dentro de otro diseño, configurar el fondo de la disposición de los padres a su color de borde/dibujable y luego establecer un relleno en él. El relleno aparecerá alrededor de su BitmapDrawable.

4

Como punto de preparar la imagen 9-parche, como a continuación y configurarlo como un fondo mediante el uso de android:background

enter image description here

+1

Me gusta esta solución. –

+0

@ChristopherPerry :) –

2

utilizo BitmapShader y drawRoundRect hacerlo y que funcione para mí, mirar la 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); 
0

Hice muchas búsquedas para implementar ese efecto t por código, antes de encontrar otra manera, pero no es lo suficientemente perfecta, puede ver la marca en cada esquina, configuro Paint.setAntiAlias ​​(true), Paint.setDither (true), Paint.setFilterBitmap (true), pero Doesn No funciona, entonces espero que alguien pueda ayudarme. 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.restore(); 
0

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

Cuestiones relacionadas