Android - Canvas 和缓冲图像 - 自定义 View 表现疯狂

标签 android android-canvas android-custom-view android-bitmap

我遇到了一些我无法解释或修复的奇怪的自定义 View 行为。

我有一个自定义 View ,我正在使用 Bitmap 来缓冲 onDraw() 调用的内容。

当我将缓冲区图像宽度设置为 2000 时,一切正常,但当我将其增加到 4000 时,缓冲过程似乎工作正常,但是当 onDraw() 尝试绘制时,它什么也没有绘制。 Bitmap 现在正在绘制,或者 Canvas.drawBitmap() 并未真正绘制它。

这不是内存不足的问题。

核心功能如下:

public class CustomView extends View {
int viewWidth;
int viewHeight;
Bitmap bmp;

int bmpWidth = 2000; // if I increase this nothing works

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
    viewHeight = (int) MeasureSpec.getSize(heightMeasureSpec);

    if(viewHeight > 0) {
        if(bmp == null) {
            try {
                bmp = Bitmap.createBitmap(bmpWidth+extraWidth, viewHeight , bitmapCfg);
            } catch(OutOfMemoryError E){
                System.gc();
                outOfMemory = true;
                return;
            }

            viewWidth = bmpWidth + extraWidth;
            createCanvas();
        }
    }

    setMeasuredDimension((int)viewWidth,(int)viewHeight);
}

public void createCanvas() {
    int pos = 0;
    Canvas canvas = new Canvas(bmp);
    canvas.drawRect(0, 0, bmpWidth, viewHeight, whiteColor);
    canvas.drawText("TEST",pos,140,textColor);
    pos += textColor.measureText("TEST");
    this.viewWidth = (int) pos;
    setMeasuredDimension(viewWidth,viewHeight);
}


protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if(outOfMemory) {
        return;
    }

    if(bmp == null) {
        return;
    }

    canvas.drawBitmap(bmp, 0,0, paint); // I think this failes to draw.
}

最佳答案

尝试关闭硬件加速。您可以在此处找到有关硬件加速的信息:http://developer.android.com/guide/topics/graphics/hardware-accel.html

当打开硬件加速时,每个位图在绘制到屏幕上之前被加载到 OpenGL Texture 中。每个设备都有最大允许的纹理大小,您已经超过了。此解决方案可能不适用于某些设备。因此,最安全的方法是将大于 2048x2048 的位图分成较小的部分,然后将它们加载到单独的较小位图中。

关于Android - Canvas 和缓冲图像 - 自定义 View 表现疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20813552/

相关文章:

android - 设置最大宽度以使用 Picasso 加载图像

安卓:找不到 com.android.support:support-v4:23.2.1

java - 这段代码有什么问题,数字溢出警告

Android Canvas 改变一些像素颜色

android - 如何将可点击的 "events"操作项添加到 actionBarSherlock?

java - Android 创建自定义 RecyclerView.Adapter 并从中创建其他类

android - Surface和Canvas的关系 : Android

android - 测量要在 Canvas 上绘制的文本高度(Android)

java - 如何从View的onDraw()方法中提取Bitmap?

android - 如何创建类似 gmail 的收件人(用户)自定义 View