2012-12-27 49 views
25

我有一個ListView其中有ImageView,ImageView圖像從服務器獲取後動態加載。 現在,我想要這些圖像,任何大小,適合一個圓形框架,如何做到這一點? 這裏有一個樣品的PIC我想如何使圖像適合Android的圓形框架

enter image description here

+1

試試這個。 http://stackoverflow.com/questions/5882180/how-to-set-bitmap-in-circular-imageview 希望它會幫助你 – 2012-12-27 08:06:08

回答

24

與以往答案的幫助下,我來到了這個solution.Hope它幫助別人:

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.PorterDuff.Mode; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.os.Bundle; 
import android.widget.ImageView; 



public class CircleImage extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.circle_layout); 
    ImageView img1 = (ImageView) findViewById(R.id.imageView1); 
    Bitmap bm = BitmapFactory.decodeResource(getResources(), 
      R.drawable.hair_four); 
    Bitmap resized = Bitmap.createScaledBitmap(bm, 100, 100, true); 
    Bitmap conv_bm = getRoundedRectBitmap(resized, 100); 
    img1.setImageBitmap(conv_bm); 
    // TODO Auto-generated method stub 
} 

public static Bitmap getRoundedRectBitmap(Bitmap bitmap, int pixels) { 
    Bitmap result = null; 
    try { 
     result = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(result); 

     int color = 0xff424242; 
     Paint paint = new Paint(); 
     Rect rect = new Rect(0, 0, 200, 200); 

     paint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(color); 
     canvas.drawCircle(50, 50, 50, paint); 
     paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
     canvas.drawBitmap(bitmap, rect, rect, paint); 

    } catch (NullPointerException e) { 
    } catch (OutOfMemoryError o) { 
    } 
    return result; 
} 

} 
+4

要獲得更有效的實現,請參閱Romain Guy最近的[** Android Recipe#1,帶圓角的圖像**]( http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/)博客文章。主要區別在於它使用「BitmapShader」來直接控制可見的「紋理」區域,從而將繪圖邏輯簡化爲單次繪製調用。 –

+0

嘿Sanghita,我遇到了相同的要求,碰巧使用你的代碼,雖然它工作正常,因爲顯示圖像我有一個問題。我用我的代替以下代碼行來增加圖像視圖爲canvas.drawCircle(90 ,90,90,油漆);因爲canvas.drawCircle(50,50,50,paint);給了一個小的顯示視圖。然而只有四分之一的圖像顯示在imageview.Can你請幫忙? – joy

+0

將以下行更改爲:Bitmap resized = Bitmap.createScaledBitmap(bm,600,600,true); 位圖conv_bm = getRoundedRectBitmap(resized,600);結果= Bitmap.createBitmap(950,950,Bitmap.Config.ARGB_8888); Rect rect = new Rect(0,0,650,650); canvas.drawCircle(300,300,300,paint); – Sanghita

10

試試這個代碼是什麼:如果你想要一個實際的圈子,那麼你可以通過100px作爲參數

public static Bitmap getRoundedRectBitmap(Bitmap bitmap, int pixels) { 
try { 
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 = pixels; 

paint.setAntiAlias(true); 
canvas.drawARGB(0, 0, 0, 0); 
paint.setColor(color); 
canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
canvas.drawBitmap(bitmap, rect, rect, paint); 
} catch (NullPointerException e) { 
// return bitmap; 
} catch (OutOfMemoryError o){} 
return result; 
} 

+0

由於一噸的幫助,你提供的解決方案是在沒有尺寸修改的圓角矩形中的圖片。它只需要幾行更改 – Sanghita

+0

@ ricintech-你們可以請你解釋如何改變用這個代碼繪製的圓的大小!圖像裁剪和其他一切都是完美的,但不知道如何增加或減少圓的半徑 – Khay

1

我們可以從XML代碼管理的圖像的高度和寬度,並且從Java代碼繪製圓/橢圓形等

<ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="@dimen/width" 
      android:layout_height="@dimen/height" 
      /> 

爲橢圓形視圖

ImageView img1 = (ImageView) findViewById(R.id.imageView1); 
Bitmap bm = BitmapFactory.decodeResource(getResources(), 
     R.drawable.user_image); 
Bitmap conv_bm = getRoundedBitmap(bm); 
img1.setImageBitmap(conv_bm); 


public static Bitmap getRoundedBitmap(Bitmap bitmap) 
{ 
    final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(output); 

    final int color = Color.RED; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    final RectF rectF = new RectF(rect); 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(color); 
    canvas.drawOval(rectF, paint); 
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 

    bitmap.recycle(); 

    return output; 
    } 

} 
-1
public static Bitmap getCircleBitmap(Bitmap bitmap) { 
     final Bitmap circuleBitmap = Bitmap.createBitmap(bitmap.getWidth(), 
       bitmap.getWidth(), Bitmap.Config.ARGB_8888); 
     final Canvas canvas = new Canvas(circuleBitmap); 

     final int color = Color.RED; 
     final Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getWidth()); 
     final RectF rectF = new RectF(rect); 

     paint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(color); 
     canvas.drawOval(rectF, paint); 

     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(bitmap, rect, rect, paint); 

     bitmap.recycle(); 

     return circuleBitmap; 
    }