Макеты Android и автоматическое изменение размера изображения - PullRequest
12 голосов
/ 26 июля 2011

У моего приложения для Android в настоящее время есть два макета: заставка, портрет и пейзаж. Оба используют один и тот же простой формат - изображение того же размера, что и экран, в простой линейной компоновке:

<?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"
   >
<ImageView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:scaleType="fitCenter"
        android:src="@drawable/splash_p"
       />
</LinearLayout>

Используется изображение размером 320 Вт x 480 ч, и Android автоматически изменяет его размер, чтобы соответствовать экрану, независимо от размера экрана устройства. Очевидно, что изображение не такое четкое, например, при изменении размера для планшета.

Я должен указать здесь, что моя цель - максимально уменьшить установленный размер конечного приложения, и я знаю, что я мог бы включать разные макеты и размеры одних и тех же изображений для каждого разного размера экрана.

Мой заставочный экран состоит из названия приложения в верхней трети экрана, а затем из изображения в двух нижних третях экрана. Чтобы сэкономить память, я хочу обрезать имя приложения и изображение в два отдельных изображения, а затем отобразить их в линейной вертикальной компоновке для устройств, удерживаемых в портретном режиме. Затем я буду использовать линейный горизонтальный макет изображения, а затем название приложения для ландшафтного режима.

Для макета портрета у меня есть это:

     <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">
        <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent"            android:layout_height="wrap_content" android:orientation="vertical">
        <View android:layout_height="45dp" android:layout_width="45dp" />   
        <ImageView android:layout_height="fill_parent" 
        android:src="@drawable/splashtext" 
        android:scaleType="fitCenter" 
        android:layout_gravity="center" 
        android:layout_width="fill_parent"></ImageView>

        <View
        android:layout_height="35dp"
        android:layout_width="35dp" />      

       <ImageView
       android:scaleType="fitCenter"
        android:src="@drawable/splashpic"
       android:layout_height="fill_parent" android:scaleType="fitCenter" android:layout_width="fill_parent" android:layout_gravity="center"/>
</LinearLayout>
</LinearLayout>

Когда я отображаю вышеупомянутое в eclipse, оно выглядит нормально для смартфонов, но изображения не масштабируются при отображении на планшете, хотя я использую аргумент android: scaleType = "fitCenter". Я попытался использовать dips вместо fill_parent в imageview layout_width и layout_height, но это тоже не работает.

Что я делаю не так? Есть ли другой способ сделать это?

Спасибо

Я отредактировал вопрос, чтобы включить этот пересмотренный XML на основе справки @ KaHa6u ниже. Так что теперь у меня есть:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent" 
   android:orientation="vertical">
    <LinearLayout android:id="@+id/linearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical">
<View
        android:layout_height="15dp"
        android:layout_width="15dp"
 /> 
<ImageView android:layout_height="wrap_content" 
        android:src="@drawable/splashtext" 
        android:adjustViewBounds="true"
        android:scaleType="fitXY" 
        android:layout_gravity="center" 
        android:layout_width="wrap_content" 
        android:layout_weight="1">
        </ImageView>


<View
        android:layout_height="15dp"
        android:layout_width="15dp"
 /> 
<ImageView
       android:scaleType="fitXY"
       android:src="@drawable/splashpic" 
       android:adjustViewBounds="false"
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:layout_weight="4" 
       android:layout_gravity="center"/>
</LinearLayout>
</LinearLayout>

Который масштабируется вертикально, но не горизонтально, поэтому я получаю высокие тонкие изображения при увеличении размера экрана.

Ответы [ 3 ]

15 голосов
/ 24 августа 2011

@basbasin

Я только что столкнулся с ситуацией, очень похожей на ту, которую вы объяснили.Мне нужно было иметь ImageView поверх макета, который должен был растягиваться ТОЛЬКО по горизонтали и сохранять его высоту, когда телефон переходит в альбомную ориентацию.Мне удалось только с этим:

<ImageView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/main_header"
    android:scaleType="fitXY"
/>

и, конечно, с атрибутом активности:

<activity android:configChanges="keyboardHidden|orientation">

Надеюсь, это поможет.Спасибо.

1 голос
/ 26 июля 2011

FitCenter scaleType поддерживает исходное соотношение сторон.Вы пробовали fitXY scaleType? Matrix.ScaleToFit Документация

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

Вы пробовали "fill_parent" в качестве значений android: layout_height и android: layout_width для ImageView, который вы хотите растянуть? Я предполагаю, что настройка "wrap_content" не дает системе знать границы, до которых можно изменить размер изображения. Пожалуйста, попробуйте и дайте мне знать о результатах.

...