Масштабирование макета Android (для элементов заданного размера в dp)

Три FrameLayout разных цветов фона для формирования полосы. Каждый FrameLayout имеет размер, указанный в dp.

[1

Полоса длинная и не помещается на экране. Как масштабировать полосу, чтобы сохранить пропорции и не меняя размеры дп?

[2

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:measureAllChildren="true">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layoutDirection="ltr"
        android:rotation="0">

    <FrameLayout
        android:layout_width="200dp"
        android:layout_height="42dp"
        android:background="#508da6"
         />
    <FrameLayout
        android:layout_width="400dp"
        android:layout_height="42dp"
        android:background="#494949"
        />
    <FrameLayout
        android:layout_width="240dp"
        android:layout_height="42dp"
        android:background="#ff0000"
       />
    </LinearLayout>
</FrameLayout>

1 ответ

Для этого не нужно раздувать три целых FrameLayout.View будет работать просто отлично. Также не следует указывать фиксированную ширину, так как нет способа заставить его работать для всех размеров экрана.

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:measureAllChildren="true">

    <LinearLayout 
        android:id="@+id/strip"
        android:layout_width="match_parent"
        android:layout_height="42dp"
        android:layoutDirection="ltr"
        android:rotation="0">

        <View
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#508da6"
            />
        <View
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#494949"
            />
        <View
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ff0000"
            />
    </LinearLayout>
</FrameLayout>

установить высоту во время выполнения

 LinearLayout stripLayout = (LinearLayout)findVieById(R.id.strip);
  stripLayout .getViewTreeObserver().addOnGlobalFocusChangeListener(new OnGlobalFocusChangeListener() {

        @Override
        public void onGlobalFocusChanged(View oldFocus, View newFocus) {
            // TODO Auto-generated method stub
            int width = stripLayout .getWidth();
            int height = //calculate your height//
            FrameLayout.LayoutParams params = stripLayout .getLayoutParams();
            params.height = height;
            stripLayout .setLayoutParams(params);

            if (Build.VERSION.SDK_INT < 16) { stripLayout .getViewTreeObserver().removeGlobalOnLayoutListener(this);   } 
            else { stripLayout .getViewTreeObserver().removeOnGlobalLayoutListener(this);  }
        }
    });
Другие вопросы по тегам