2012-06-13 33 views
17

Użyłem poniższego, aby utworzyć bitmapę z zaokrąglonymi narożnikami. Teraz chcę narysować linię wokół bitmapy.Obramowanie bitmapy z zaokrąglonymi narożnikami w systemie 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; 
    } 

Mam obraz poniżej, ale moją rzeczywistą potrzebą jest to, że muszę narysować obramowanie wokół obrazu.

+1

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

Odpowiedz

40

umieścić następujące razem dla siebie.

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

kuponów, oczywiście, do http://ruibm.com/?p=184

0

Niestety nie ma ładny i schludny parametr „border” w Androidzie, ale najprostszym sposobem na to jest do obudowania, że ​​w innym układzie, ustawić tło układ dominującej na twój kolor obramowania/odkształcalne a następnie ustaw na nim dopełnienie. Wypełnienie pojawi się wokół twojego BitmapDrawable.

4

Jak o przygotowanie 9-Patch obraz jak poniżej i ustawić go jako tło za pomocą android:background

enter image description here

+1

Podoba mi się to rozwiązanie. –

+0

@ ChristopherPerry :) –

2

używam BitmapShader i drawRoundRect to zrobić i to działa na mnie, spójrz na zdjęcie

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

Zrobiłem wiele wyszukiwania, aby wdrożyć ten efekt t przez kod, zanim znalazłem inny sposób, ale nie jest on wystarczająco doskonały, możesz zobaczyć roggy na każdym rogu, ustawiam Paint.setAntiAlias ​​(true), Paint.setDither (true), Paint.setFilterBitmap (true), ale to robi Działa, więc mam nadzieję, że ktoś mi pomoże. 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

mój sposób:

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

Wynik

enter image description here

Powiązane problemy