3

メソッドでカスタムコンポーネントを作成すると、onMeasureはサイズを指定でき、インデントも指定できます(this.getPaddingTop()などを使用)。問題は、onMeasureの計算方法が値「マージン...」を取得するかどうかです。onMeasureでの「this.getLayoutParams()」メソッドの使用は歓迎されないことを考えると、「margin ...」の値を設定/取得するための正しい正規のソリューションを提供してください。

例:

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

        int wSpecMode = MeasureSpec.getMode( widthMeasureSpec );
        int wSpecSize = MeasureSpec.getSize( widthMeasureSpec );
        int hSpecMode = MeasureSpec.getMode( heightMeasureSpec );
        int hSpecSize = MeasureSpec.getSize( heightMeasureSpec );
        int lMargin = ((RelativeLayout.LayoutParams)this.getLayoutParams()).leftMargin;
        int rMargin = ((RelativeLayout.LayoutParams)this.getLayoutParams()).rightMargin;
        int tMargin = ((RelativeLayout.LayoutParams)this.getLayoutParams()).topMargin;
        int bMargin = ((RelativeLayout.LayoutParams)this.getLayoutParams()).bottomMargin;
        int wSize = 256, hSize = 256;

        if (wSpecMode == MeasureSpec.EXACTLY) {
            wSize = wSpecSize;
        } else {
            wSize += this.getPaddingLeft() + this.getPaddingRight() + lMargin + rMargin;

            if (wSpecMode == MeasureSpec.AT_MOST) {
                wSize = Math.min(wSize, wSpecSize);
            }
        }

        if (hSpecMode == MeasureSpec.EXACTLY) {
            hSize = hSpecSize;
        } else {
            hSize += this.getPaddingTop() + this.getPaddingBottom() + tMargin + bMargin;

            if (hSpecMode == MeasureSpec.AT_MOST) {
                hSize = Math.min(hSize, hSpecSize);
            }
        }
        this.setMeasuredDimension( wSize, hSize );
    }

この例では、計算された平均は大丈夫です。マージンとパディングを考慮しましたが、マージンを取得する方法はあまり洗練されていません。

さらに、このアプローチ領域コンポーネントは、同じマージンで、getMeasuredWidth()およびgetMeasuredHeight( )を介してサイズを取得する際に、より多くなります-計算は正しくありません。

4

0 に答える 0