Android - Canvas.drawBitmap在某些设备上无法正常工作
我的android应用程序出现问题,它在平面上绘制函数图。为此,我使用自定义视图。用户可以通过触摸平移坐标系。在onDraw方法中,坐标系和标签直接绘制在视图的画布上,但是图形本身被缓冲到一个额外的位图上(出于执行的原因) - 在手指移动期间,这个位图被绘制到视图的画布上以匹配坐标系,并且只有当用户释放触摸时才重新绘制功能。Android - Canvas.drawBitmap在某些设备上无法正常工作
public void onDraw(Canvas canvas){
if (start) {
bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
hCanvas = new Canvas(bitmap);
start = false;
}
drawCoordinateSystem(canvas);
drawFunctions(canvas,bitmap,hCanvas);
}
在onTouch事件侦听器中,我调用invalidate()。有一个布尔型“移动”,对ACTION_UP设置为true,对于ACTION_DOWN设置为false。
public void drawFunctions(Canvas canvas,Bitmap bitmap,Canvas hCanvas){
if (moving) canvas.drawBitmap(bitmap,left+translateX,top+translateY,paint);
else {
hCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
//code for drawing the functions on hCanvas
canvas.drawBitmap(bitmap,0,0,paint);
}
}
在ACTION_MOVE中,我适当地计算了translateX和translateY值。
现在问题出在哪里: 如果我为sdk 10编译应用程序,它在我测试过的所有设备(Android 2.2-4.2智能手机和平板电脑,虚拟和物理)上运行正常。但是,当我为sdk 14编译它时,对于许多设备(除了某些平板电脑,其坐标系被正确绘制),它的效果很好,但包含函数的位图不会在视图的画布上绘制,并且功能不可见。奇怪的是,如果我尝试从视图画布中制作位图:
Bitmap bmp = this.getDrawingCache();
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
在保存的位图中,函数是可见的。
另一件事是 - 问题发生在i.a. Nexus 7,同时在预设的Nexus 7上创建的AVD一切正常。
可能是什么问题?
http://developer.android.com/reference/android/graphics/Bitmap.Config.html
我会复制并粘贴相关部分: Bitmap.Config ARGB_4444该字段在API级别已被否决。由于此配置的质量差,因此建议使用ARGB_8888。
Bitmap.Config ARGB_8888每个像素存储在4个字节。
改变你的4444到8888,它应该工作。
感谢您的建议,但它仍然无法正常工作。更重要的是,位图相当大(比屏幕更大,因此用户可以在滚动的同时获得实时呈现的印象),所以如果我设置ARGB8888,某些设备上存在内存问题。我使用ARGB4444来最大限度地减少内存使用量。另一件事 - 我的问题似乎只发生在Tegra设备上。在使用位图绘制其他视图之前,有什么办法可以缓冲某些内容? – user2073589 2013-02-15 17:24:06