2016-04-14 2 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 - это circleImageView.

Пожалуйста, помогите мне исправить проблему.

+0

Возможный дубликат [Незначительный выпуск из памяти e при загрузке изображения в объект Bitmap] (http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-object) –

+0

Попробуйте другое изображение. Маленькое по размеру. Если оно по-прежнему имеет значение, тогда вам нужно будет проверить «CircularImageView» –

ответ

1

Обычно я бы сказал, что ошибка может быть где угодно, и вы, вероятно, просачиваетесь. Но вы делаете 2 новых растровых изображения в onDraw? И все 3 в памяти? Мало того, что это ужасно расточительно, но ваша производительность будет сосать - вы должны даже избегать использования новых в onDraw, тем более выделяя растровые изображения.

Выбросьте это и перепишите его полностью. Вы должны избегать работы с возможностью рисования здесь (тем более, что вы все равно принимаете его растровое изображение, что является плохой идеей), вы должны взять имя файла или идентификатор ресурса растрового изображения и прочитать его в/масштабировать с помощью команды 1 createBitmap используя BitmapOptions. Вы должны сделать это, когда битмап установлен и сохранить результат, НЕ масштабируйте в onDraw, который вызывается все время. Вы можете избежать 3-го растрового изображения с помощью кругового обтравочного контура вместо использования режимов портер-даффа и второго холста. Вы можете сделать все это всего лишь с 1 растровым изображением и должны.

2

Я вижу, что вы используете Picasso для загрузки изображений, почему бы не использовать преобразования изображения picasso. это очень просто реализовать: -

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 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 –

Смежные вопросы