2012-06-13 3 views
17

Ho utilizzato il sotto per creare una bitmap con angoli arrotondati. Ora voglio disegnare una linea attorno alla bitmap.Bordo su una bitmap con angoli arrotondati in 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; 
    } 

Ho ottenuto l'immagine qui sotto, ma il mio bisogno reale è che devo disegnare un bordo intorno all'immagine.

+1

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

risposta

40

ho messo il seguente insieme per me stesso. Io uso

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

crediti, naturalmente, per http://ruibm.com/?p=184

0

Purtroppo non c'è nessun parametro bello e pulito "confine" in Android, ma il modo più semplice per farlo è quello di racchiudere che all'interno di un altro layout, impostare lo sfondo del layout genitore per il vostro colore del bordo/drawable e quindi impostare un riempimento su di esso. Il padding apparirà attorno a BitmapDrawable.

4

ne preparare immagine 9-patch come qui di seguito e impostarla come sfondo utilizzando android:background

enter image description here

+1

Mi piace questa soluzione. –

+0

@ChristopherPerry :) –

2

BitmapShader e drawRoundRect farlo e lavorare per me, un'occhiata alla schermata

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

Ho fatto molte ricerche per implementare questo effetto t by code, prima di trovare un altro modo ma non è abbastanza perfetto, puoi vedere il jaggy su ogni angolo, ho impostato Paint.setAntiAlias ​​(true), Paint.setDither (true), Paint.setFilterBitmap (true), ma It doesn Lavorare, quindi spero che qualcuno possa aiutarmi. 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

la mia strada:

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

Risultato

enter image description here