Не можете правильно измерить пользовательский вид? - PullRequest
1 голос
/ 03 августа 2011

Я пишу пользовательский View объект, но я не могу заставить его измерить правильно. Глядя на исходный код View , я подумал, что достаточно будет вызвать setMinimumHeight() и setMinimumWidth() (это действительно все, что мне нужно, минимальный размер, который должен соблюдать родительский макет). Вот мой код:

public class MonthView extends View {

    private final int minCellSize = 24;

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

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

    public MonthView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final float scale = getContext().getResources().getDisplayMetrics().density;
        setMinimumHeight((int) (minCellSize * scale * 6));
        setMinimumWidth((int) (minCellSize * scale * 7));
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.RED);
    }

}

Довольно просто. Затем я вставляю его в LinearLayout, что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <com.foghina.adtp.MonthView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:text="I am below the monthview!"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1" />
</LinearLayout>

Однако MonthView занимает весь экран, а TextView не виден. Как правильно написать мой View, чтобы он имел минимальную высоту / ширину при использовании wrap_content?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Я понял это в конце концов. Мне пришлось написать свою собственную версию View.getDefaultSize(), которая немного отличается. Вот как я это использовал:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final float scale = getContext().getResources().getDisplayMetrics().density;
    setMeasuredDimension(getSize((int) (minCellSize * scale * 7), widthMeasureSpec),
            getSize((int) (minCellSize * scale * 6), heightMeasureSpec));
}

private static int getSize(int size, int measureSpec) {
    int result = size;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize =  MeasureSpec.getSize(measureSpec);

    switch (specMode) {
    case MeasureSpec.UNSPECIFIED:
        result = size;
        break;
    case MeasureSpec.AT_MOST:
        result = size < specSize ? size : specSize;
        break;
    case MeasureSpec.EXACTLY:
        result = specSize;
        break;
    }

    return result;
}

Довольно противно. Я не понимаю, почему значение по умолчанию View.getDefaultSize() так не работает.

0 голосов
/ 03 августа 2011

Думаю, вы должны использовать setMeasureDimension ()

...