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);

保存されたビットマップでは、関数が表示されます。

もう1つのことは、問題はNexus 7で発生しますが、プリセットのNexus 7で作成されたAVDではすべて正常に動作します。

何が問題になる可能性がありますか?

4

1 に答える 1

1

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

関連する部分をコピーして貼り付けます: Bitmap.Config ARGB_4444 このフィールドは API レベルで廃止されました。この構成は品質が低いため、代わりに ARGB_8888 を使用することをお勧めします。
Bitmap.Config ARGB_8888 各ピクセルは 4 バイトに格納されます。

4444 を 8888 に変更すると、動作するはずです。

于 2013-02-15T04:44:01.333 に答える