Java Android-Canvas.drawBitmap不';在某些设备上无法正常工作

Java Android-Canvas.drawBitmap不';在某些设备上无法正常工作,java,android,android-canvas,buffering,drawbitmap,Java,Android,Android Canvas,Buffering,Drawbitmap,我的android应用程序在平面上绘制函数图时遇到了问题。为此,我使用自定义视图。用户可以通过触摸平移坐标系。在onDraw方法中,坐标系和标签直接绘制在视图的画布上,但图形本身被缓冲到附加位图上(出于性能原因)-在手指移动期间,该位图被绘制到视图的画布上,并进行转换以匹配坐标系,只有当用户释放触摸时,功能才会重新绘制 public void onDraw(Canvas canvas){ if (start) { bitmap = Bitmap.createBitmap(

我的android应用程序在平面上绘制函数图时遇到了问题。为此,我使用自定义视图。用户可以通过触摸平移坐标系。在onDraw方法中,坐标系和标签直接绘制在视图的画布上,但图形本身被缓冲到附加位图上(出于性能原因)-在手指移动期间,该位图被绘制到视图的画布上,并进行转换以匹配坐标系,只有当用户释放触摸时,功能才会重新绘制

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()。有一个布尔值“移动”,对于动作_向上设置为true,对于动作_向下设置为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);
    }   
}
在动作中,我适当地计算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上,一切正常

有什么问题吗?

我将复制并粘贴相关部分: Bitmap.Config ARGB_4444此字段在API级别被弃用。因为穷人 此配置的质量,建议改用ARGB_8888。
位图.Config ARGB_8888每个像素存储在4个字节中

将您的4444更改为8888,它应该可以工作。

我将复制并粘贴相关部分: Bitmap.Config ARGB_4444此字段在API级别被弃用。因为穷人 此配置的质量,建议改用ARGB_8888。
位图.Config ARGB_8888每个像素存储在4个字节中


将您的4444更改为8888,应该可以使用。

谢谢您的建议,但它仍然不起作用。更重要的是,位图非常大(比屏幕大,因此用户在滚动时会得到实时渲染的印象),因此如果我设置argb888,某些设备上会出现内存问题。我使用argb444来最小化内存使用。另一件事-我的问题似乎只发生在Tegra设备上。在绘制其他画布之前,是否有一种方法可以缓冲某些内容,而不是使用位图?谢谢你的建议,但它仍然不起作用。更重要的是,位图非常大(比屏幕大,因此用户在滚动时会得到实时渲染的印象),因此如果我设置argb888,某些设备上会出现内存问题。我使用argb444来最小化内存使用。另一件事-我的问题似乎只发生在Tegra设备上。在绘制到画布之前,是否有一种方法可以缓冲某些内容,而不是使用位图?