2013-02-14 133 views
1

我的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一切正常。

可能是什么问题?

回答

0

http://developer.android.com/reference/android/graphics/Bitmap.Config.html

我会复制并粘贴相关部分: Bitmap.Config ARGB_4444该字段在API级别已被否决。由于此配置的质量差,因此建议使用ARGB_8888。
Bitmap.Config ARGB_8888每个像素存储在4个字节。

改变你的4444到8888,它应该工作。

+0

感谢您的建议,但它仍然无法正常工作。更重要的是,位图相当大(比屏幕更大,因此用户可以在滚动的同时获得实时呈现的印象),所以如果我设置ARGB8888,某些设备上存在内存问题。我使用ARGB4444来最大限度地减少内存使用量。另一件事 - 我的问题似乎只发生在Tegra设备上。在使用位图绘制其他视图之前,有什么办法可以缓冲某些内容? – user2073589 2013-02-15 17:24:06

相关问题