1

描画する View を拡張するクラスがあります。

ビューが特定の寸法を持つ RelativeLayout の子として設定されているにもかかわらず、ビューのキャンバスは幅が 1280 (デバイスと同じ幅) であると報告します。

キャンバスをそのビューのサイズによって制約するために何をする必要があるかを理解しようとしています(常識が示すように)。

私が見落としていることに興味があります...ここに関連するコードスニペットがあります...

dv = new DrawView(this, getWindowManager());
    dv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    //this wrapper is 500x500
    ((RelativeLayout)findViewById(R.id.drawWrapper)).addView(dv);
    L.log("DRAWVIEW WIDTH = " + dv.getWidth()); //this reports 0... why?

DrawView内...

@Override
public void onDraw(Canvas canvas) {

    L.log("CANVAS WIDTH ON DRAW = " + canvas.getWidth()); //this always reports 1280 on xoom
    this.canvas = canvas;
    drawElementsOntoCanvas(canvas, true, false);
    ...     
}

私が見落としているものはありますか、またはビュー内のキャンバスは常に画面全体の幅と高さですか?

相対レイアウトの XML:

           <RelativeLayout 
            android:id="@+id/drawWrapper"
            android:layout_width="500px"
        android:layout_height="500px"        
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dip" 
        android:clipChildren="true"
        android:background="@drawable/cut_out_frame"           
        />  
4

1 に答える 1

0

ああ、今私はそれを見ます:)

clipChildren = true がありますが、これは含まれているレイアウトに適用されます。子ビューは親の境界外に描画できますが、描画は単に親の寸法にクリップされます。

ここでは、ウィンドウマネージャーを使用して DrawView を構築しているようです

dv = new DrawView(this, getWindowManager());
dv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

コンストラクターが表示されていないので、後続の setLayoutParams が FILL_PARENT、つまり画面全体を使用していると推測しています。

私があなたなら、DrawView の標準コンストラクターを実装し、それをレイアウト XML にレイアウトします。これが「Android」のやり方です。また、onMeasure() をオーバーライドして DrawView の大きさを追跡し、x と y を内部フィールドに格納して、必要なスケーリングを行うために使用することもできます。そうすれば、レイアウトが変わるたびに (向きの変更、異なる解像度のサポート、新しいバージョン)、コードを変更する必要はありません。

最後に、レイアウトで PX を使用しないでください (理由が本当にわからない限り)。代わりに DIP を使用してください。

于 2012-09-29T09:29:42.733 に答える