0

私は現在、カスタムViewGroupクラスを実装しました。これは、アイテム(描画可能なボタン)を画面全体に均等かつ斜めに配置しようとします。

残念ながら、アイテムが大きすぎると、すべてが画面に収まるようにオーバーラップする傾向があります。

既存のレイアウト(API8 +)を使用してこれを実現する簡単な方法があることを望んでいます。または、単純なものがある場合は、ViewGroupクラスを変更して、子ビューを小さくして重複を回避できます。(各子に、オーバーラップせずに均等にレイアウトするために必要な正確なサイズを表示させるなど)

これが私のonMeasureクラスです(特別なことは何もしていません。子供たちに自分で測定させます)

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

        measureChildren(widthMeasureSpec, heightMeasureSpec);

         int width = MeasureSpec.getSize(widthMeasureSpec);
         int height = MeasureSpec.getSize(heightMeasureSpec);

        setMeasuredDimension(width, height);
    }

編集:onMeasureを変更して、子を特定の幅/高さまで手動で測定すると、クリップされます。子ビュー(またはそのドローアブル)が実際に測定値の内側に収まるように拡大縮小されているようには見えません。

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

        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);

        int newChildWidth = width / getChildCount();
        int newChildHeight = height / getChildCount();

        final int size = getChildCount();
        for (int i = 0; i < size; ++i) {
            View child = getChildAt(i);

            child.measure(MeasureSpec.EXACTLY | newChildWidth, MeasureSpec.EXACTLY | newChildHeight);
        }

        setMeasuredDimension(width, height);
    }
4

1 に答える 1

1

これまでのところ、正しいアイデアがあります。子のビューを正確に斜めにレイアウトする場合は、それを実現ViewGroupするためのを提供し、各子にどのくらいの大きさになるかを指示するのは、囲みの仕事です。また、これを交換して、コンテンツの少ない子供を小さくすることもできます。指定したサイズを超えることはありませんが、毎回すべて同じサイズになります。MeasureSpecMeasureSpec.EXACTLYMeasureSpec.AT_MOSTEXACTLY

Viewあなたが今説明している問題は、いくつかのカスタマイズなしでは実際には解決できない問題です。Androidビューは、「ビューをそのコンテンツに合わせてサイズ変更する」というパラダイムでのみ機能し、「コンテンツをビューのサイズに合わせてサイズ変更する」というパラダイムでは機能しません。したがってButton、テキスト/画像のコンテンツを描画するために必要なスペースよりも小さくするように指示すると、単にクリップされます。この規則の1つの例外はImageViewです。これを回避したい場合は、Buttonで指定された仕様に基づいて、テキストサイズと描画可能サイズのサイズを変更するようにカスタマイズする必要があります。onMeasure()

とにかくカスタマイズしているので、別の可能なオプションはViewGroup、子の静的変換を利用することです。呼び出しsetStaticTransformationsEnabled(true)ViewGroupオーバーライドgetChildStaticTransformation()することにより、特定のサイズよりも大きくしたい各子ビューに倍率を適用できます。この変換はアニメーションの動作に似ているため、ビュー全体が縮小されます。

HTH

于 2012-04-30T19:45:54.957 に答える