2012-06-13 8 views
17

में गोलाकार कोनों के साथ बिटमैप पर सीमा मैंने गोलाकार कोनों के साथ बिटमैप बनाने के लिए नीचे उपयोग किया। अब मैं बिटमैप के चारों ओर एक रेखा खींचना चाहता हूं।एंड्रॉइड

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

मुझे नीचे दी गई छवि मिली, लेकिन मेरी वास्तविक आवश्यकता यह है कि मुझे छवि के चारों ओर एक सीमा खींचनी होगी।

+1

http://stackoverflow.com/questions/3263611/border-for-an-image- व्यू-इन-एंड्रॉइड – Andy

उत्तर

40

का उपयोग करके एक पृष्ठभूमि के रूप में सेट अपने आप के लिए एक साथ निम्नलिखित मैं डाल करने के लिए।

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

क्रेडिट्स, ज़ाहिर है, http://ruibm.com/?p=184

0

दुर्भाग्य से एंड्रॉयड में कोई अच्छा और साफ "सीमा" पैरामीटर है, लेकिन सबसे आसान तरीका यह डिब्बे में बंद एक और लेआउट के भीतर होता है जो आपके सीमा रंग/drawable के लिए माता-पिता लेआउट की पृष्ठभूमि सेट किया गया है करने के लिए है और उसके बाद एक पैडिंग सेट करें। पैडिंग आपके बिटमैप ड्रायरेबल के आसपास दिखाई देगी।

4

कैसे के बारे में नीचे की तरह 9-पैच छवि तैयार करने और android:background

enter image description here

+1

मुझे यह समाधान पसंद है। –

+0

@ क्रिस्टोफरपेरी :) –

2

को मैं उपयोग BitmapShader और drawRoundRect यह है और यह मेरे लिए काम करते हैं, स्क्रीनशॉट

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
को देखो

मैंने effec को लागू करने के लिए कई खोज की हैं कोड द्वारा टी, मुझे एक और रास्ता मिलने से पहले, लेकिन यह पर्याप्त नहीं है, आप प्रत्येक कोने पर जागी देख सकते हैं, मैंने पेंट.सेटएन्टीअलीस (सच), पेंट.सेट डाउन (सच्चा), पेंट.सेटफिल्टर बिटमैप (सत्य) सेट किया है, लेकिन यह नहीं करता है काम नहीं करते, इसलिए मुझे उम्मीद है कि कोई मेरी मदद कर सकता है। 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

मेरे रास्ते:

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

परिणाम

enter image description here