0

幅 = 0dp から幅 = 300dp にアニメーション化されるカスタム ビュー (ViewGroup) があります。子供が描かれた後にキャンバスを操作したい。これを実現するために、dispatchDraw(Canvas) をオーバーライドしています。ただし、カスタム ビューのサイズが小さい場合でも、子を 300 dp キャンバスにレンダリングする必要があります。大きなキャンバスを dispatchDraw(Canvas) メソッドに渡すと、子は位置とサイズを調整しません。

私の質問は、ビューグループの幅を大きくして、子がより大きな面にレンダリングされるようにするにはどうすればよいですか?

よろしく、ロバート

4

1 に答える 1

0

ビュー (ViewGroups を含む) がそれ自体を描画する必要があるたびに、そのディメンションを取得するために onMeasure メソッドが呼び出されます。その後、描画する場所の位置を取得するために onLayout が呼び出されます。draw メソッドは onMeasure および onLayout の後に呼び出されるため、これは発生しませんこちらを参照してください。onMeasure を合計すると寸法が計算され、onLayout が位置を設定し、最後に onDraw がレンダリングを行います。したがって、onMeasure を使用して目的のディメンションを設定することをお勧めします。たとえば、これは子ビューにサイズが正確に 300 x 150 ピクセルであることを伝える onMeasure メソッドです。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSpec;
    int heightSpec;

    widthSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.EXACTLY);
    heightSpec = MeasureSpec.makeMeasureSpec(150, MeasureSpec.EXACTLY);

    llTopBar.measure(widthSpec, heightSpec); //<-- llTopBar is the child...

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); //<--This is important
}

ピクセルの代わりにディップを使用したい場合は、変換する必要がありますここを参照してください。

使用可能なスペースよりも大きなサイズの子を測定できますが、クリッピングやその他の要因により、期待どおりの結果が得られない場合があります (たとえば、ViewGroup が別の ViewGroup にある場合)。

あなたの質問から、左から右にスライドするものを構築していることがわかります。おそらく、slidedrawer のソース コードが参考になるでしょう。

お役に立てれば...

于 2013-07-08T02:18:12.560 に答える