1

幅を高さとして使用して、正方形のカスタム ビューを作成しようとしています。UIとして膨らませる事前定義されたレイアウトも使用しています。onMeasure をオーバーライドするとすぐに、カスタム ビューが表示されなくなりました。これが私のコードです:

public class MyView extends RelativeLayout{

    public MyView(Context context) {
        super(context);
        addView(setupLayout(context));
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        addView(setupLayout(context));
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        addView(setupLayout(context));
    }

    private View setupLayout(Context context) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View myView = inflater.inflate(R.layout.view_layout, null);
        return myView;
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(widthMeasureSpec));
    }

}

2 つの質問があります。

  1. onMeasure をオーバーライドして、期待どおりにビューを描画するにはどうすればよいですか?
  2. ビュー階層に関してこれをより効率的にする方法はありますか (つまり、RelativeLayout を RelativeLayout 内に配置しないでください)。
4

1 に答える 1

1

同様の質問に対する Jan Němec の回答からこのコードを使用できます。

import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class SquareLayout extends LinearLayout {

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

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

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

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

        if (width > (int)(mScale * height + 0.5)) {
            width = (int)(mScale * height + 0.5);
        } else {
            height = (int)(width / mScale + 0.5);
        }

        super.onMeasure(
                MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
        );
    }
    }

または、このライブラリ プロジェクトを使用してみてください。

于 2012-06-30T20:03:08.953 に答える