2015-05-30 3 views
-1

Я работаю над андроидным приложением, в котором я использую растровое изображение, но проблема в том, что иногда это показывает мне ошибку из памяти и мое приложение разбивается. Я использую растровые изображения вместе с BitmapShadder, мой код приведен ниже, где мое приложение показывает эту ошибку.Исключено из памяти исключение в Bitmap Shadder android

public class CircularImageView extends ImageView { 
private int borderWidth = 0; 
private int viewWidth; 
private int viewHeight; 
private Bitmap image; 
private Paint paint; 
private Paint paintBorder; 
private BitmapShader shader; 

public CircularImageView(Context context) { 
    super(context); 
    setup(); 
} 

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

public CircularImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setup(); 
} 

private void setup() { 
    // init paint 
    paint = new Paint(); 
    paint.setAntiAlias(true); 

    paintBorder = new Paint(); 
    setBorderColor(Color.WHITE); 
    paintBorder.setAntiAlias(true); 
    this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder); 
    // paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK); 
} 

public void setBorderWidth(int borderWidth) { 
    this.borderWidth = borderWidth; 
    this.invalidate(); 
} 

public void setBorderColor(int borderColor) { 
    if (paintBorder != null) 
     paintBorder.setColor(borderColor); 

    this.invalidate(); 
} 

private void loadBitmap() { 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable(); 

    if (bitmapDrawable != null) 
     image = bitmapDrawable.getBitmap(); 
} 

// @SuppressLint("DrawAllocation") 
@Override 
public void onDraw(Canvas canvas) { 
    // load the bitmap 
    loadBitmap(); 

    // init shader 
    if (image != null) { 

     // Out Of Memory Error Comes Here.... 

     shader = new BitmapShader(Bitmap.createScaledBitmap(image,canvas.getWidth(), canvas.getHeight(), false),Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
     paint.setShader(shader); 
     int circleCenter = viewWidth/2; 

     // circleCenter is the x or y of the view's center 
     // radius is the radius in pixels of the cirle to be drawn 
     // paint contains the shader that will texture the shape 
     canvas.drawCircle(circleCenter + borderWidth, circleCenter 
       + borderWidth, circleCenter + borderWidth - 4.0f, 
       paintBorder); 
     canvas.drawCircle(circleCenter + borderWidth, circleCenter 
       + borderWidth, circleCenter - 4.0f, paint); 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int width = measureWidth(widthMeasureSpec); 
    int height = measureHeight(heightMeasureSpec, widthMeasureSpec); 

    viewWidth = width - (borderWidth * 2); 
    viewHeight = height - (borderWidth * 2); 

    setMeasuredDimension(width, height); 
} 

private int measureWidth(int measureSpec) { 
    int result = 0; 
    int specMode = MeasureSpec.getMode(measureSpec); 
    int specSize = MeasureSpec.getSize(measureSpec); 

    if (specMode == MeasureSpec.EXACTLY) { 
     // We were told how big to be 
     result = specSize; 
    } else { 
     // Measure the text 
     result = viewWidth; 
    } 

    return result; 
} 

private int measureHeight(int measureSpecHeight, int measureSpecWidth) { 
    int result = 0; 
    int specMode = MeasureSpec.getMode(measureSpecHeight); 
    int specSize = MeasureSpec.getSize(measureSpecHeight); 

    if (specMode == MeasureSpec.EXACTLY) { 
     // We were told how big to be 
     result = specSize; 
    } else { 
     // Measure the text (beware: ascent is a negative number) 
     result = viewHeight; 
    } 

    return (result + 2); 
} 
} 
+0

Добавить блок исключений outOfMemory Error –

ответ

0

Попробуйте использовать это в своем ярлыке приложения.

android:largeHeap="true" 
+0

Он должен работать. –

+0

спасибо за ваш ответ. Оно работает –

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