Android-画布和缓冲图像-自定义视图
我遇到一些奇怪的自定义视图行为,我无法解释或修复 我有一个自定义视图,我正在使用Android-画布和缓冲图像-自定义视图,android,android-canvas,android-custom-view,android-bitmap,Android,Android Canvas,Android Custom View,Android Bitmap,我遇到一些奇怪的自定义视图行为,我无法解释或修复 我有一个自定义视图,我正在使用位图来缓冲onDraw()调用的内容 当我将缓冲区图像宽度设置为2000时,一切正常,但当我将其增加到4000时,缓冲过程似乎正常,但当onDraw()尝试绘制时,它不会绘制任何内容。现在正在绘制位图,或者Canvas.drawBitmap()没有真正绘制它 这不是内存不足的问题 以下是核心功能: public class CustomView extends View { int viewWidth; int vi
位图
来缓冲onDraw()调用的内容
当我将缓冲区图像宽度设置为2000时,一切正常,但当我将其增加到4000时,缓冲过程似乎正常,但当onDraw()
尝试绘制时,它不会绘制任何内容。现在正在绘制位图
,或者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.
}
}尝试关闭硬件加速。您可以在此处找到有关硬件加速的信息:
打开硬件加速后,每个位图在屏幕上绘制之前都会加载到OpenGL纹理中。每个设备都有一个最大允许纹理大小,您正在超过该大小。此解决方案可能无法在某些设备上运行。因此,最安全的方法是将大于2048x2048的位图分割成更小的块,然后将它们加载到更小的位图中