2

ディメンション パラメータの 1 つとしてインフレートされ、もう 1 つのディメンションとしてインフレートされると、一定のアスペクト比を持ち、どちらのディメンションが に設定されていても満たされますが、レイアウト インフレータに他のディメンションを提供するViewように、カスタムを作成したいと考えています。「包まれる」。これが可能なのは、たとえば、全画面幅の場合、2 行、3 行、または任意の数のテキスト行 (幅に応じて) のスペースを確保することを要求できることは明らかですが、インフレーションするまで必ずしもこれを認識していないためです。 -時間。wrap_contentmatch_parentmatch_parentTextView

理想的には、サブクラスのレイアウト メソッドをオーバーライドしてView、ビューが膨張したときにレイアウト情報を取得し、「コンテンツ」をラップするための独自の寸法 (つまり、固定比率の四角形) を指定することです。

これらのカスタム ビューを多数作成し、それらをさまざまな種類のレイアウト (場合によっては を使用) に配置する必要があるため、Adapter実際には、それらの拡張を最大限に制御したいと考えています。これを行うための最良のテクニックは何ですか?

4

2 に答える 2

1

onMeasure でアスペクト比への準拠をいつでも確認できます。

私が知っている完全な答えではありませんが、それはあなたをそこに導くはずです;)

于 2012-05-23T10:59:48.237 に答える
0

私は今、次のコードでこれを解決しました。私がオーバーライドしているクラスはViewGroupカスタムの子を持つカスタムであり、すべて継承されonMeasureた . 子は構築時に作成および追加されますが、これは当然必要なことだと思います。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    float width = MeasureSpec.getSize(widthMeasureSpec);
    final int widthMode = MeasureSpec.getMode(widthMeasureSpec);

    float height = MeasureSpec.getSize(heightMeasureSpec);
    final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

    float nominalHeight = getResources().getInteger(R.integer.nominalheight);
    float nominalWidth = getResources().getInteger(R.integer.nominalwidth);

    float aspectRatio = nominalWidth / nominalHeight;

    if( widthMode == MeasureSpec.UNSPECIFIED ) { //conform width to height
        width = height * aspectRatio;
    }
    else if (heightMode == MeasureSpec.UNSPECIFIED ) { //conform height to width
        height = width / aspectRatio;
    }
    else if( width / height > aspectRatio //too wide
            && ( widthMode == MeasureSpec.AT_MOST )
            ) { 
        width -= (width - height * aspectRatio);
    }
    else if( width / height < aspectRatio //too tall
            && ( heightMode == MeasureSpec.AT_MOST )
            ) { 
        height -= (height - width / aspectRatio);
    }

    int newWidthMeasure = MeasureSpec.makeMeasureSpec((int)width, MeasureSpec.AT_MOST);
    int newHeightMeasure = MeasureSpec.makeMeasureSpec((int)height, MeasureSpec.AT_MOST);
    measureChildren(newWidthMeasure, newHeightMeasure);

    setMeasuredDimension((int)width, (int)height);
}

リソースの名目上の長方形の観点からアスペクト比を定義していますが、明らかにこれを行う方法は他にもたくさんあります。

最初に私を指摘してくれたJosephus Villareyに感謝しonMeasure(...)ます。

于 2012-06-04T16:53:08.870 に答える