2016-04-14 153 views
-1

我試圖在CircularImageView中加載圖像,但它給我outOfMemory錯誤。 我使用下面的代碼CircularImageView:在CircularImageView中加載圖像時出現內存不足錯誤

CircularImageView.java

public class CircularImageView extends ImageView { 

    public CircularImageView(Context ctx, AttributeSet attrs) { 
     super(ctx, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     Drawable drawable = getDrawable(); 

     if (drawable == null) { 
      return; 
     } 

     if (getWidth() == 0 || getHeight() == 0) { 
      return; 
     } 
     Bitmap b = ((BitmapDrawable) drawable).getBitmap(); 
     Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); 

     int w = getWidth(), h = getHeight(); 

     Bitmap roundBitmap = getRoundedCroppedBitmap(bitmap, w); 
     canvas.drawBitmap(roundBitmap, 0, 0, null); 

    } 

    public static Bitmap getRoundedCroppedBitmap(Bitmap bitmap, int radius) { 
     Bitmap 
       finalBitmap; 
     if (bitmap.getWidth() != radius || bitmap.getHeight() != radius) 
      finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, 
        false); 
     else 
      finalBitmap = bitmap; 
     Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(), 
       finalBitmap.getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(output); 

     final Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, finalBitmap.getWidth(), 
       finalBitmap.getHeight()); 

     paint.setAntiAlias(true); 
     paint.setFilterBitmap(true); 
     paint.setDither(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(Color.parseColor("#BAB399")); 
     canvas.drawCircle(finalBitmap.getWidth()/2 + 0.7f, 
       finalBitmap.getHeight()/2 + 0.7f, 
       finalBitmap.getWidth()/2 + 0.1f, paint); 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(finalBitmap, rect, rect, paint); 

     return output; 
    } 

} 

我用它在設計下面給出:

<com.almabay.almachat.circularImageView.CircularImageView 
    android:id="@+id/img_group" 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:layout_alignParentLeft="true" /> 

我從服務器獲取圖像,並試圖使用適配器在列表視圖中顯示它。以下代碼正在使用:

Picasso.with(context).load(image_url).error(R.drawable.default_avatar).into(viewHolder.imgGroup); 

image_url是要在圓形圖像視圖中加載的圖像的URL .ViewHolder.imgGroup是circularImageView。

請幫我解決這個問題。

+0

可能的重複[奇怪的內存不足issu同時將圖像加載到位圖對象](http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-object) –

+0

嘗試其他圖像..這是小尺寸..如果它仍然有關,那麼將需要檢查'CircularImageView' –

回答

1

通常我會告訴你,錯誤可能在任何地方,你可能會泄漏。但是你在onDraw中創建了2個新的位圖?所有3個都在記憶中?這不僅浪費,而且你的表現會很糟糕 - 你甚至應該避免在onDraw中使用新的,更不用說分配位圖。

扔掉它並完全重寫它。你應該避免在這裏使用drawable(特別是因爲你認爲它是一個位圖,這是一個壞主意),你應該獲取位圖的文件名或資源ID並讀入/使用1 createBitmap命令縮放它使用BitmapOptions。你應該在設置位圖時保存結果,不要在所有時間調用的onDraw中縮放。您可以通過使用圓形剪切路徑而不是使用porter duff模式和第二個畫布來避開第三個位圖。你只需要一個位圖就可以做到這一點,而且應該。

2

我看到你正在使用畢加索爲圖像加載爲什麼不使用畢加索圖像轉換。這是非常簡單的實現: -

ImageView im = (ImageView) findViewById(R.id.img1); 

    Picasso.with(MainActivity2.this).load(R.drawable.kitten) 
      .transform(new CropCircleTransformation()).into(im); 

,它看起來像這樣

enter image description here

你只需要添加的轉換類

import com.squareup.picasso.Transformation; 

import android.graphics.Bitmap; 
import android.graphics.BitmapShader; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 

public class CropCircleTransformation implements Transformation { 

    @Override public Bitmap transform(Bitmap source) { 
    int size = Math.min(source.getWidth(), source.getHeight()); 

    int width = (source.getWidth() - size)/2; 
    int height = (source.getHeight() - size)/2; 

    Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 

    Canvas canvas = new Canvas(bitmap); 
    Paint paint = new Paint(); 
    BitmapShader shader = 
     new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); 
    if (width != 0 || height != 0) { 
     // source isn't square, move viewport to center 
     Matrix matrix = new Matrix(); 
     matrix.setTranslate(-width, -height); 
     shader.setLocalMatrix(matrix); 
    } 
    paint.setShader(shader); 
    paint.setAntiAlias(true); 

    float r = size/2f; 
    canvas.drawCircle(r, r, r, paint); 

    source.recycle(); 

    return bitmap; 
    } 

    @Override public String key() { 
    return "CropCircleTransformation()"; 
    } 
} 

更多的轉換,我們才能在這裏找到https://github.com/wasabeef/picasso-transformations

+0

請檢查CircularImageView.java的代碼。這行是位圖bitmap = b.copy(Bitmap.Config.ARGB_8888,true);正在給我例外。 –

+0

請使用此轉換類https://github.com/wasabeef/picasso-transformations/blob/master/transformations/src/main/java/jp/wasabeef/picasso/transformations/CropCircleTransformation.java –

相關問題