1

我的 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()。有一个布尔“移动”,对于 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);

在保存的位图中,功能是可见的。

另一件事是 - ia Nexus 7 出现问题,同时在使用预设 Nexus 7 创建的 AVD 上一切正常。

可能是什么问题?

4

1 回答 1

1

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

我将复制并粘贴相关部分:Bitmap.Config ARGB_4444 This field was deprecated in API level 。由于此配置质量较差,建议改用ARGB_8888。
Bitmap.Config ARGB_8888 每个像素存储在 4 个字节上。

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

于 2013-02-15T04:44:01.333 回答