0

これはonDraw()私のカスタムビューの方法です:

@Override
    protected void onDraw(Canvas canvas) {
        Paint p = new Paint();
        p.setColor(Color.RED);

        Bitmap bmp = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bmp);
        c.drawARGB(255, 255, 0, 0);
        c.drawText("Text", 50, 50, p);
        canvas = c;

        canvas.drawARGB(255, 0, 0, 255);
        canvas.drawText("Text1", 20, 20, p);
//      canvas = c;
    }

上記の方法の結果は、色やテキストのないビューです。しかし、最初canvas = cにコメントして最新のコメントを外すと(ブロックの最後の行で)、結果は「text1」が正しい位置に表示された青いビューになります。のこのオーバーライドの結果onDraw():

@Override
    protected void onDraw(Canvas canvas) {
        Paint p = new Paint();
        p.setColor(Color.RED);
        canvas.drawARGB(255, 0, 0, 255);
        canvas.drawText("Text1", 20, 20, p);
    }

カスタム ビューのキャンバスを参照すると、結果が変更されるのはなぜですか?また、最初のオーバーライドでも、ビューが色なしで表示され、赤色で表示されないのはなぜですか?

編集:

c1、c2 が、別々に作成されたクラス C のインスタンスであるとします。

c1 = c2;

次に、c1 のすべてのプロパティは c2 のプロパティと等しくなります。私の質問は次のとおりです。

  1. キャンバスのプロパティを使用するcanvas = cと、c と等しくならないのはなぜですか? (c は赤でテキストがありますが、カスタム ビューには色もテキストもありません)
  2. 1回目と2回目の違いは何canvas = cですか? 先ほども言いましたが、結果が違います。
4

3 に答える 3

0

キャンバスメモリはレンダリング用にどこかに固定されていると思います。キャンバス参照を変更することはできません。つまり、代わりに別のメモリ ブロックを使用することはできません。したがって、何かを描画したい場合は、入力メモリの内容を変更する必要があります。私の意見に同意しますか?

于 2013-07-15T01:10:47.733 に答える
0

最初のオーバーライドでは、ビューのキャンバスではなくビットマップから作成されたキャンバスに描画しています。ビューにビットマップを描画する必要がある場合は、渡されたオブジェクトでキャンバス クラスの drawBitmap メソッドを呼び出す必要があります。あなたがしていることは、メモリ内にあるものをビットマップに描画し、UI に表示されるものには影響しません。

于 2013-07-15T01:14:20.067 に答える
0

ここを見てください。これがあなたの質問に対する答えだと思います。

特に次の部分:

これで、Canvas が定義済みのビットマップ上に描画されます。Canvas で描画した後、Canvas.drawBitmap(Bitmap,...) メソッドの 1 つを使用して Bitmap を別の Canvas に運ぶことができます。View.onDraw() または SurfaceHolder.lockCanvas() によって提供される Canvas を介して、最終的なグラフィックを最終的に描画することをお勧めします (次のセクションを参照してください)。

あなたの編集に基づいて

いくつかのポイント状態で、私のリンクを読んでください:

View コンポーネントの onDraw() 内で、さまざまな Canvas.draw...() メソッド、または Canvas を引数として取る他のクラス draw() メソッドを使用して、すべての描画に指定された Canvas を使用します。onDraw() が完了すると、Android フレームワークは Canvas を使用して、システムによって処理されるビットマップを描画します。

ここで重要なのは、「Android フレームワークは Canvas を使用して、システムによって処理されるビットマップを描画する」というフレーズです。この例で行っているのは、onDraw メソッドからキャンバス (c) を割り当てることです。これは、Android がキャンバス用に作成したものとは異なるビットマップ用であるため、描画は実行されません。ただし、最初のキャンバス = c にコメントを付け、最後のキャンバス = c のコメントを外すと、正しいビットマップに青いテキストを描画するということが起こります。実際には、最後のキャンバス = c のコメントを外さなくても同じ結果が得られます。

元のキャンバス オブジェクトの drawBitmap 関数の 1 つを使用して、システムが作成したビットマップにビットマップを転送してみてください。

編集であなたが言っていることは正しいです。canvas = cを実行している場合、canvasがcと等しいことが起こりますが、canvasはAndroidが元のcanvasオブジェクト用に作成したビットマップとは異なるビットマップを使用しているため、描画なし...

お役に立てれば...

于 2013-07-15T01:17:17.230 に答える