【问题标题】:How to fix OutOfMemory on Android如何在 Android 上修复 OutOfMemory
【发布时间】:2019-06-19 08:07:07
【问题描述】:

我正在尝试解决 Android 中的 ImageMap 问题。因此,我编写了一个小类,将触摸坐标与先前定义的区域相匹配。 这是课程:

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (observer != null) {
        if(checkClickArea(event)){
            observer.OnAreaClick(v,event, matchedArea);
        }

    }
    return false;
}

boolean checkClickArea(MotionEvent event){

    Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int displayWidth = size.x;
    int displayHeight = imageView.getHeight();

    int touchImageX = Math.round((imageWidth / displayWidth) * event.getX());
    int touchImageY = Math.round((imageHeight / displayHeight) * event.getY());


    if (arealist != null) {
        for (ImageArea area : arealist) {
            if (area.rectF.contains(touchImageX, touchImageY)) {
                matchedArea = area;
                return true;
            }
        }
    }
    return false;
}

到目前为止,这将起作用。为了将点击区域标记为“点击”,我将不同的图像放入LayerDrawable 并将它们提供给图像视图。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = findViewById(R.id.imageView);
    imageView.setImageDrawable(getDrawable(R.drawable.kopf));
    drawablesIDs.add(R.drawable.kopf);

    ImageClickRecognizer imageClickRecognizer = new ImageClickRecognizer(getApplicationContext(), ((BitmapDrawable) getDrawable(R.drawable.kopf)));
    imageClickRecognizer.setImageView(imageView);
    imageClickRecognizer.setOnAreaClickListener(this);


}


@Override
public void OnAreaClick(View v, MotionEvent event, ImageClickRecognizer.ImageArea area) {



    final int resourceId = getResources().getIdentifier(area.shape.name, "drawable",getPackageName());


    if (drawablesIDs.contains(resourceId)){

        drawablesIDs.remove(Integer.valueOf(resourceId));
        updateImageView();

    }else{
        drawablesIDs.add(Integer.valueOf(resourceId));
        updateImageView();

    }
}


private void updateImageView(){
    Drawable[] layers = new Drawable[drawablesIDs.size()];

    for (int i=0; i<drawablesIDs.size(); i++){
        Drawable draw = getDrawable(drawablesIDs.get(i));
        draw.setAlpha(150);
        layers[i] = draw;
    }

    LayerDrawable layerDrawable = new LayerDrawable(layers);
    imageView.setImageDrawable(layerDrawable);

}

除了一个小的延迟,它也可以正常工作,唯一的问题是,一旦第十二张图像加载到 LayerDrawable 中,我就会收到 OOM 错误。虽然图像是 10 kBit png。

任何想法为什么会这样?

【问题讨论】:

  • 你的图片有多大的像素?
  • 所有图片的尺寸为 1265x903
  • 我将图像大小减半,现在它可以工作了。

标签: android out-of-memory imagemap


【解决方案1】:

如果你会看到Android Handling Bitmaps

这在大图像的情况下很常见。

在放入Drawable[]之前,你应该使用inSampleSize来缩放你的图像

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

calculateInSampleSize 方法是从Android Loading Large images efficiently 中挑选出来的。

【讨论】:

    【解决方案2】:

    尝试在清单文件中添加以下内容:

    <application
        ...
        android:hardwareAccelerated="false"
        android:largeHeap="true">
    
        <activity>
            ...
        </activity>
    
    </application>
    

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2016-11-14
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多