2012-12-27 18 views
25

Ho uno ListView in cui è presente uno ImageView, l'immagine nello ImageView viene caricata dinamicamente dopo essere stata recuperata dal server. Ora, voglio che queste immagini, di qualsiasi dimensione, si adattino a una cornice circolare, come fare? Ecco una foto del campione di ciò che voglioCome convertire un'immagine in una cornice circolare in Android

enter image description here

+1

Prova questa. http://stackoverflow.com/questions/5882180/how-to-set-bitmap-in-circular-imageview spero che vi aiuterà a –

risposta

24

Con l'aiuto di risposta precedente sono arrivato fino a questo solution.Hope è aiutare gli altri:

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

Per un'implementazione leggermente più efficiente, fai riferimento alla recente [** Ricetta Android # 1 di Romain Guy, con gli angoli arrotondati **] (http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/) post sul blog. La differenza principale consiste nell'usare un 'BitmapShader' per controllare direttamente l'area 'testurizzata' visibile, che semplifica la logica di disegno in una singola chiamata di disegno. –

+0

Ehi Sanghita, mi sono imbattuto nello stesso requisito e mi è capitato di usare il tuo codice anche se funziona bene per la visualizzazione dell'immagine che ho un problema. Ho sostituito la seguente riga di codice con la mia per aumentare la vista dell'immagine come canvas.drawCircle (90 , 90,90, vernice); poiché canvas.drawCircle (50, 50,50, paint); ha dato una piccola visualizzazione del display. Tuttavia, solo 1 quarto dell'immagine è stata visualizzata nell'immagini.Puoi aiutarci? – joy

+0

cambia le seguenti righe come: Bitmap ridimensionato = Bitmap.createScaledBitmap (bm, 600, 600, true); Bitmap conv_bm = getRoundedRectBitmap (ridimensionato, 600); result = Bitmap.createBitmap (950, 950, Bitmap.Config.ARGB_8888); Rect rect = new Rect (0, 0, 650, 650); canvas.drawCircle (300, 300, 300, paint); – Sanghita

10

provare questo codice:

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

Se si desidera un cerchio reale, allora si può passare 100px come parametro.

+0

Grazie una tonnellata per il vostro aiuto, la soluzione che hai fornito era per le immagini in angoli più arrotondati rettangolo senza modifica delle dimensioni. Servivano solo poche righe di modifica – Sanghita

+0

@ ricintech- puoi ragazzi spiegare per favore come cambiare la dimensione del cerchio disegnato con questo codice! l'immagine che si ritaglia e tutto il resto è perfetto ma non riesco a capire come aumentare o diminuire il raggio del cerchio – Khay

8

Aggiornamento

C'è un CircleImageView disponibile su Github.

È possibile ottenere l'ultima versione da Maven repository come aggiunta come dipendenza gradle.

1

Possiamo gestire l'altezza e la larghezza di un'immagine dal codice XML e disegnare cerchio/ovale dal codice Java come

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

per la vista ovale

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