2016-04-14 139 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 –

相关问题