ホームページ  >  記事  >  Java  >  改行レイアウト用のカスタム ViewGroup を作成するにはどうすればよいですか?

改行レイアウト用のカスタム ViewGroup を作成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-08 02:32:01656ブラウズ

How to Create a Custom ViewGroup for Line-Breaking Layouts?

改行レイアウト用のカスタム ViewGroup

問題:

複数のウィジェットをラップ可能な方法で表示し、使用可能なスペースに合わせて必要に応じてウィジェットを行に分割するレイアウト。デフォルトの ViewGroup コンポーネントにはこの機能がありません。

解決策:

改行を実現するには、カスタム ViewGroup を作成できます。方法は次のとおりです:

  1. 子の測定:

    onMeasure() で、利用可能な幅を計算し、子ビューを反復処理します。それぞれの子供について、幅と高さを測定します。 line_height を更新して、指定された行の子の最大高さを表します。

  2. 改行の決定:

    測定中に、子ビューの累積幅が使用可能な幅を超えています。存在する場合は、幅をリセットし、ypos を次の行に増やします。

  3. レイアウト パラメーターの設定:

    generateDefaultLayoutParams() と checkLayoutParams をオーバーライドします。 () を使用してカスタム レイアウト パラメータを定義します。これらのパラメータは、たとえばウィジェット間の間隔を指定できます。

  4. Layout 子ビュー:

    onLayout() で、子ビューを再度反復処理し、測定された寸法と xpos および ypos 変数に基づいて配置します。ウィジェットを行に追加するときに xpos を更新します。

  5. XML 属性サポートの提供:

    レイアウト パラメーターを公開するカスタム XML 属性を作成します。これにより、レイアウト XML ファイルでそれらを指定できるようになります。

実装例:

public class PredicateLayout extends ViewGroup {

    private int line_height;

    public PredicateLayout(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // Calculate available width
        // Iterate through child views and measure them

        if (xpos + childw > width) {
            xpos = getPaddingLeft();
            ypos += line_height;
        }
        ...
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        for (int i = 0; i < count; i++) {
            if (xpos + childw > width) {
                xpos = getPaddingLeft();
                ypos += line_height;
            }
            // Position the child view
        }
    }
}

このカスタム レイアウトを使用すると、次のことができます。ウィジェットに必要なラップ可能な動作を実現します。

以上が改行レイアウト用のカスタム ViewGroup を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。