0

view1FrameLayout を拡張し、このように onMeasure() をオーバーライドするビューがあるため、正方形としてレンダリングされます。

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
  }

view2を拡張する別のビューを作成したいのですが、高さが親と同じであるため、全画面をカバーしview1たいと考えています。view2今のところ、私もそれを正方形として取得しています。

どうすればこれを達成できますか?

4

2 に答える 2

1

Squareの onMeasure は、コードに従って、渡された高さを無視する場所で既にオーバーライドされているため、次のようになります。

@Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
  }

あなたが望むことを行う1つの方法-view1を拡張するview2ですが、現在、view2の高さを親と同じにして、全画面をカバーする必要があります-setDimensionで呼び出しているview2のonMeasureをオーバーライドすることですこのように。 ..

public class Square2 extends Square {

    public Square2(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

試した後のサンプルがこちら。(Square View のコードについては、onMeasure のコードをコピーしただけです)。

正方形の使用: ここに画像の説明を入力

正方形 2 の場合:

ここに画像の説明を入力

お役に立てれば。

于 2016-03-07T03:05:23.840 に答える
1

ビュー 1:

private boolean measureAsSquare = true;

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (measureAsSquare) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
    else {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

public void setMeasureAsSquare(boolean b) {
    measureAsSquare = b;
}

ビュー 1 をサブクラス化する View2 コンストラクター:

public View2(Context c) {
    setMeasureAsSquare(false);
}

次に、ビュー 2 に通常のレイアウトのウェイトと高さを使用して、優先サイズを割り当てることができます。

于 2016-03-07T02:51:20.030 に答える