3

説明も修正もできない奇妙なカスタム ビューの動作が発生しています。

私はカスタム ビューを持っています。呼び出し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.
}

}

4

1 に答える 1

1

ハードウェア アクセラレーションをオフにしてみてください。ハードウェア アクセラレーションに関する情報は、http: //developer.android.com/guide/topics/graphics/hardware-accel.htmlで見つけることができます。

Textureハードウェア アクセラレーションをオンにすると、各ビットマップは画面に描画される前にOpenGL に読み込まれます。各デバイスには最大許容テクスチャ サイズがあり、それを超えています。このソリューションは、一部のデバイスでは機能しない場合があります。したがって、最も安全な方法は、2048x2048 より大きいビットマップを小さな断片に分割し、それらを別々の小さなビットマップにロードすることです。

于 2013-12-28T10:44:57.160 に答える