0

現在、SlidingDrawer クラスを拡張していて、コンテンツの幅を変更したいのですが、正しく動作させることができません。現在、ビュー全体 (ハンドルとコンテンツ) の幅を設定しています。これはサイズ変更の目的で機能しますが、ハンドルを移動すると視覚的な不具合が発生し、一瞬新しいサイズにジャンプしてからハンドルに戻ります。位置。問題は、コンテンツ領域のサイズ変更を妨げているベース SlidingDrawer で発生しているonMeasure()or呼び出しに起因していると考えていますが、完全にはわかりません。onLayout()

ビュー全体のサイズを変更するために使用getLayoutParams().width = newWidth;していますが、のようなものを使用したいと思いmContent.getLayoutParams().width = newWidth;ます。

のソース コードonMeasure()ここにあり、のソース コードはここにありonLayout() ます

コンテンツ領域のサイズを変更できない理由についての洞察は素晴らしいでしょう。ありがとう!

4

1 に答える 1

0

それで、他の誰かがこれに問題を抱えているかどうかを最終的に理解しました。基本的に、レイアウトのサイズを変更したい場合はmeasure()、サイズ変更後のレイアウトが必要です。呼び出しがないoffsetLeftAndRight()と、ハンドルは一瞬新しいサイズに「ジャンプ」するため、オフセットを設定するとその「ジャンプ」がなくなります。

私がしたことの単純化されたバージョンは、本質的に次のとおりです。

public void resize() {
   int previousPosition = mHandle.getLeft();

   //Set the new size of the content area
   mContent.getLayoutParams().width = width;

   //Measure the newly sized content area and adjust the layout
   mContent.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getBottom() - getTop(), MeasureSpec.EXACTLY));
   mContent.layout(handleWidth + mTopOffset, 0, mTopOffset + handleWidth + content.getMeasuredWidth(), content.getMeasuredHeight());

   /* Remeasure any other views that were resized also here */

   //Not required but helps position the handle correctly
   mHandle.offsetLeftAndRight(previousPosition);
}
于 2013-09-10T16:56:15.207 に答える