10

私はこれで試しました

@Override
protected void onDraw(Canvas canvas)
{
    Log.e("TEST", "canvas width: " + canvas.getWidth() + "");
    Log.e("TEST", "view width: " + this.getWidth() + "");

    Log.e("TEST", "canvas height: " + canvas.getHeight() + "");
    Log.e("TEST", "view height: " + this.getHeight() + "");
    super.onDraw(canvas);
    Log.e("TEST", "canvas width: " + canvas.getWidth() + "");
    Log.e("TEST", "view width: " + this.getWidth() + "");

    Log.e("TEST", "canvas height: " + canvas.getHeight() + "");
    Log.e("TEST", "view height: " + this.getHeight() + "");
}

そして、これが結果です:

canvas width: 320
view width: 480
canvas height: 533
view height: 300
canvas width: 320
view width: 480
canvas height: 533
view height: 300

私のmain.xmlの一部

    android:layout_width="480px"
    android:layout_height="300px"

私のログプリントと私のxmlの一部によると、ビューのサイズは正しいです。私のデバイスは 480x800 で、幅と高さの両方をログの結果で割ると 1.5 (800/533=1.5 および 480/320=1.5) になるため、画面全体から Canvas を取得して描画しているようです。これはなぜですか?なぜこんなに小さいのですか?通常の方法で描画するにはどうすればよいですか?

4

1 に答える 1

15

スーツアップ、

ビュー管理のキャンバス オブジェクトは、常に画面サイズとは異なる可能性があります。上記のロジックを使用しているオブジェクトに大きく依存します。この理由は、親と子がどのようにレンダリングされ、処理サイクルのどこで呼び出されるかに応じて、Android が新しいキャンバスを作成するか、古いキャンバスを再利用するためです。動作をオーバーライドしてビューを動的に変更すると、事態はさらに奇妙になります(特に、レイアウト/測定/描画サイクル中にそうする場合.

なにこれ、なんでこんなに小さいの…

キャンバスのサイズは、それが含まれるオブジェクトのレイアウト パラメータに基づいています。onMeasure または onLayout をオーバーライドすると、キャンバスは再調整が必要なものだけを再調整します。キャンバスのサイズに問題がある場合は、描画しているビューのレイアウト パラメータを確認する必要があります。大きい場合も小さい場合もあります。フルスクリーン (通知バーなし) でスタイルを使用していないアクティビティの両方に (または)がmatch_parentある最上位の View/ViewGroup の画面と同じサイズになるだけです。fill_parentlayout_widthlayout_heightTheme.Dialog

... 通常の方法で描画するにはどうすればよいですか?

それは、通常の意味とニーズによって異なります。UI 全体を手動で管理しようとしている場合は、最上位のオブジェクトを制御する必要があります。これは通常、動作をオーバーライドできるようにトップレベル ビューを拡張することによって行われます。ランチャーは、最上位の FrameLayout とその子ビューをオーバーライドすることでこれを行います。十分な大きさのキャンバスがある場合、画面から物を描くことができるため、これはコストがかかる可能性があることに注意してください。

ほとんどのプログラムは子ビューを利用し、子ビューが親ビューの描画方法を制御するべきではないことを理解して、描画方法を単にオーバーライドします。この場合、キャンバスは小さく制限されていますが、ロジックが最適化され、レンダリングを安定させながら、それに応じてオブジェクトを移動できます。

ゲームはSurfaceView、ニーズを満たすためにフルスクリーンを利用します。これにより、非常に柔軟なキャンバスが提供され、マニュアルと絶え間なく変化するプレゼンテーションに優先順位が付けられます。これを行う方法を示す多くの例とチュートリアルがあります。Google で を検索するだけですSurfaceView

一般に、ほとんどのビューでは、デフォルトのレンダリングおよび描画メソッドをオブジェクト指向の性質で利用できます。onMeasure や onLayout などの関数を適切に利用すると、多くの場合、望ましい結果が得られます。あなたの特定のニーズについて詳しく知らなくても、これが最善のアドバイスです。

詳細情報 (関連性については不明)

望ましい結果を得るには、Android がビューをレンダリングする方法を理解することが重要です。エンジンには多くのことが行われているため、複数の画面を考慮しなければならず、多くの異なるパラメーターを指定して同じビューをレンダリングするさまざまな方法を考慮する必要があります。レイアウト パラメーターを利用して、必要な作業量を削減する方法を研究したいと思います。さらに、onMeasure、onLayout、および onDraw の間の関係に関する多くの情報があります。多くの場合、適切なパラメーターを適切なビューに適用するだけで、オブジェクトを正しくレンダリングするために必要な制御の量に大きな違いが生じます。

お役に立てれば、

ファジカルロジック

于 2012-06-08T23:24:57.000 に答える