Мне нужен FrameLayout, который будет игнорировать измерения ребенка - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть это FrameLayout:

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/searchresult_picture_layout"
    android:background="@drawable/img_bkgd_results_patch">

    <ProgressBar
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_gravity="center"
        android:id="@+id/searchresult_progressbar"
        android:indeterminate="true"
        android:visibility="gone"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/searchresult_picture"
        android:layout_gravity="center"
        android:scaleType="centerCrop"/>
</FrameLayout>

И я хочу, чтобы FrameLayout был таким же большим, как фон, который я передаю. Если ImageView больше, чем фон для FrameLayout, я хочу, чтобы ImageView масштабировался, чтобы соответствовать, а не растягивать макет.

Я попытался сделать нестандартный макет, но я думаю, что на самом деле. Вот где я попал:

public class PolaroidFrameLayout extends FrameLayout {

public PolaroidFrameLayout(Context context) {

    super( context );
}

public PolaroidFrameLayout(Context context, AttributeSet attrs) {

    super( context, attrs );
}

public PolaroidFrameLayout(Context context, AttributeSet attrs, int defStyle) {

    super( context, attrs, defStyle );
}

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

    Drawable background = getBackground();
    int backgroundWidth = background.getMinimumWidth();
    int backgroundHeight = background.getMinimumHeight();

    setMeasuredDimension( backgroundWidth, backgroundHeight );

    for (int i = 0; i < getChildCount(); i++) {

        View v = getChildAt( i );
        int viewWidth = v.getWidth();
        int viewHeight = v.getHeight();

        v.measure( MeasureSpec.makeMeasureSpec( Math.min( backgroundWidth, viewWidth ), MeasureSpec.AT_MOST ), MeasureSpec.makeMeasureSpec( Math.min( backgroundHeight, viewHeight ), MeasureSpec.AT_MOST ) );
    }
}

}

Макет остается желаемого размера, но дети никогда не рисуются. Что еще мне нужно переопределить, чтобы это работало?

Спасибо за любой вклад.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2011

В onMeasure () вам нужно измерить детей самостоятельно. Вы должны вызывать measure () для каждого ребенка.

0 голосов
/ 07 ноября 2011

попробуйте так:

<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/searchresult_picture_layout">

<!-- background layer -->
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/img_bkgd_results_patch">

<ProgressBar
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_gravity="center"
    android:id="@+id/searchresult_progressbar"
    android:indeterminate="true"
    android:visibility="gone"/>

<ImageView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/searchresult_picture"
    android:layout_gravity="center"
    android:scaleType="centerCrop"/>

0 голосов
/ 23 февраля 2011

Мне кажется, что более простым решением было бы определить размер фона и код, который по ширине родительского макета напрямую, используя

android:layout_width="100dp"

Где 100 - ширина вашей версии среднего разрешения.изображения.Есть ли причина, по которой подход с жестким кодированием не будет работать для вас?

...