Странное масштабирование пользовательского интерфейса Android?

Пользовательский интерфейс в нашем приложении не масштабируется должным образом на разных телефонах. Скриншоты ниже сделаны для Samsung 2 и Xperia Z1 Compact. Оба телефона используют экраны среднего размера, поэтому я подумал, что черная панель навигации, появившаяся после API 14, вызвала проблему масштабирования. Я добавил следующий код в свой проект, но результат остался прежним:

mMainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);//sets the layout as if the navigation bar is hidden (even if it’s not)

mMainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//help your app maintain a stable layout. 

http://sv.tinypic.com/view.php?pic=34673n4&s=8#.Uwzbi_3B5p8= < strong>Xperia Z1 Compact

http://sv.tinypic.com/view.php?pic=2lifqd5&s=8#.UwtyjP3B5p8= < сильный>Самсунг 2

Как вы можете видеть на снимках экрана, высота не такая, как должна быть в Xperia (мы хотим, чтобы пользовательский интерфейс масштабировался, как в Samsung 2). В Xperia текст меньше, наш логотип меньше (в основном по высоте) и так далее. Кажется, что пользовательский интерфейс Xperia имеет более широкую ширину или? С чем это может быть связано, если это не панель навигации? Я также опубликую XML-файл, даже если я на 99% уверен, что с ним все в порядке:

<?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"
android:paddingBottom="4sp"
android:paddingLeft="35dp"
android:paddingRight="35dp"
android:weightSum="1.0" >

<ViewSwitcher
    android:id="@+id/landing_search_switcher_banner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inAnimation="@anim/fadein"
    android:outAnimation="@anim/fadeout" >

    <ImageView
        android:id="@+id/landing_search_image_banner_license"
        android:layout_width="wrap_content"
        android:layout_height="230dp"
        android:layout_gravity="center"
        android:layout_marginTop="1sp"
        android:contentDescription="@string/ContentDescriptionLogo"
        android:gravity="center"
        android:scaleType="fitCenter"
        android:src="@drawable/app" />

    <ImageView android:id="@+id/landing_search_image_banner" 
        android:layout_width="wrap_content" 
        android:layout_height="230dp" 
        android:layout_marginTop="1sp" 
        android:contentDescription="@string/ContentDescriptionLogo" 
        android:gravity="center" 
        android:layout_gravity="center"
        android:scaleType="centerInside" 
        android:src="@drawable/app"/>
</ViewSwitcher>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="1dp"
    android:orientation="horizontal"
    android:weightSum="1.0" >

    <EditText
        android:id="@+id/landing_search_field"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:layout_weight="0.75"
        android:background="@android:drawable/edit_text"
        android:digits="/0123456789.abcdefghijklmnopqrstuvwxyz"
        android:gravity="left|center"
        android:hint="xlarge res"
        android:inputType="number"
        android:maxLines="1" 
        android:textSize="35sp"/>

    <ImageButton
        android:id="@+id/landing_search_button"
        android:layout_width="0dip"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:layout_weight="0.25"
        android:background="@android:drawable/btn_default"
        android:contentDescription="@string/ContentDescriptionSearchButton"
        android:scaleType="center"
        android:src="@drawable/ic_button_search" />
</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="2sp"
    android:layout_marginRight="4sp"
    android:layout_marginTop="6sp"
    android:background="#ffffff"
    android:orientation="vertical" >

    <LinearLayout style="@style/BarTitleStyle"
        android:layout_height="58dp"
         android:layout_width="fill_parent"
          >

        <TextView
            android:id="@+id/landing_search_list_topbar_label"
            style="@style/TitleTextStyle"
            android:text="@string/LabelInformation"
            android:textSize="32sp"
             >
        </TextView>

        <include layout="@layout/menu_button" 

            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:weightSum="1.0" >

        <ListView
            android:id="@+id/landing_search_list"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.9"
            android:background="@color/white"
            android:cacheColorHint="@color/white"
            android:gravity="left"
            android:isScrollContainer="false"
            android:visibility="gone" />

        <LinearLayout
            android:id="@+id/landing_search_search_information_section"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_weight="0.9"
            android:orientation="vertical"
            android:paddingBottom="9sp"
            android:visibility="visible" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:orientation="vertical"
                android:weightSum="1.0" >

                 <TextView
                android:id="@+id/landing_search_current_book_label"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="-9.5dp"
                android:gravity="center|bottom"
                android:text="@string/LabelCurrentBook"
                android:textColor="#515151"
                android:textSize="39sp"
                android:textStyle="bold" />


                <Button
                    android:id="@+id/landing_search_button_book"
                    android:layout_width="wrap_content"
                    android:layout_height="80dp"
                    android:layout_gravity="center|top"
                    android:ellipsize="end"
                    android:maxLines="1"
                    android:minWidth="170sp"
                    android:textSize="39.5sp"
                    android:scrollHorizontally="true"
                    android:singleLine="true"
                    android:background="@null"
                    android:text="@string/ButtonLabelChooseBook"
                    android:textColor="#1453DB" />

                <Button
                    android:id="@+id/landing_search_button_school"
                    android:layout_width="wrap_content"
                    android:layout_height="92sp"
                    android:layout_gravity="center|top"
                    android:ellipsize="end"
                    android:maxLines="1"
                    android:minWidth="170sp"
                    android:scrollHorizontally="true"
                    android:singleLine="true"
                    android:text="@string/ButtonLabelChooseSchool"
                    android:textColor="#1453DB"
                    android:visibility="gone" />
            </LinearLayout>


            <!--
            <Button
                android:id="@+id/landing_search_choose_book_button"
                android:layout_width="wrap_content"
                android:layout_height="18.5dp"
                android:layout_gravity="center|top"
                android:autoLink="web"
                android:background="@null"
                android:gravity="center|top"
                android:text="@string/ButtonLabelChooseBook"
                android:textColor="#5c5cff"
                android:textSize="14sp" >
            </Button>
            -->

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="3sp"
                android:layout_marginTop="-5.5sp"
                android:gravity="center"
                android:text="@string/LabelNoSearchResult"
                android:textColor="#7f7f7f"
                android:textSize="28.5sp" />

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="6.5sp"
                android:gravity="center"
                android:text="@string/LabelNoSearchResult2"
                android:textColor="#515151"
                android:textSize="28.5sp"
                android:layout_marginBottom="7.5dp" >
            </TextView>

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:autoLink="email"
                android:gravity="center"
                android:text="@string/LabelContactEmail"
                android:textColor="#1453DB"
                android:textColorLink="#1453DB"
                android:textSize="32.5sp"
                android:layout_marginBottom="7.5dp" >
            </TextView>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

<Button
    android:id="@+id/landing_search_button_buy"
    android:layout_width="420dp"
    android:layout_height="130dp"
    android:layout_gravity="center"
    android:layout_marginTop="9dp"
    android:background="@drawable/button_buy"
    android:contentDescription="@string/ButtonLabelSubscribe"
    android:gravity="center"
    android:paddingBottom="0sp"
    android:textColor="#515151"
    android:textSize="14.5sp"
    android:textStyle="bold" >
</Button>
<Button
    android:id="@+id/landing_search_premium"
    android:layout_width="825sp"
    android:layout_height="220sp"
    android:layout_gravity="center"
    android:layout_marginTop="-12dp"
    android:background="@drawable/premium_logo"
    android:gravity="center"
    android:paddingBottom="0sp"
    android:textColor="#515151"
    android:textSize="14.5sp"
    android:textStyle="bold" >
</Button>

</LinearLayout>

person Jesper Martensson    schedule 25.02.2014    source источник
comment
эта разница возникает из-за разной плотности устройства или разной плотности пикселей на дюйм. использование изображения с таким соотношением может решить вашу проблему, но таким образом вы не сможете сделать это правильно для всех наборов устройств.   -  person Manmohan Badaya    schedule 25.02.2014
comment
Итак, вы говорите: всегда будут некоторые устройства Android, которые масштабируют пользовательский интерфейс не так, как предполагается, независимо от того, что вы делаете? Каким же образом вы должны построить пользовательский интерфейс? запутался   -  person Jesper Martensson    schedule 26.02.2014
comment
для нескольких устройств возьмите несколько наборов макетов / папок, которые почти / точно соответствуют вашему набору устройств. Если это какое-то устройство, которое все еще не соответствует вашему пользовательскому интерфейсу, возьмите доступную ширину или наименьшую ширину макета/папки с возможностью рисования.   -  person Manmohan Badaya    schedule 26.02.2014
comment
Одна вещь, которую я забыл упомянуть в своем ответе, заключается в том, что в Android 3.2 и более поздних версиях вы можете определять свои собственные сегменты, поэтому потенциально вы можете избежать этой проблемы, но я думаю, что вам придется создать много сегментов, чтобы все устройства выглядели очень похожими. Информация здесь: android-developers.blogspot .com/2011/07/   -  person Tenfour04    schedule 10.03.2014


Ответы (1)


Эти два устройства могут иметь разную ширину в единицах DP.

Предполагая, что вы говорите о Galaxy S2:

Они оба имеют примерно одинаковый размер экрана. Тем не менее, S2 имеет плотность 217 пикселей на дюйм, что ближе к нижнему пределу корзины hdpi, а у Xperia — 342 ppi, что ближе к верхней границе корзины xhdpi. Именно из-за того, где они попадают в свои корзины плотности, они масштабируются несколько по-разному, и вы мало что можете с этим поделать.

Единицы DP и SP гарантируют, что ваши элементы будут примерно одинакового размера на всех устройствах.

Подумайте о старых версиях Windows, которые вы могли использовать, где приложения игнорировали dpi монитора. Если вы использовали монитор с более высоким разрешением, вы просто видели меньший текст. Это похоже на то, что все мониторы были в одном и том же ведре dpi.

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

У iOS нет этой проблемы, потому что каждое «ведро» соответствует ровно одному dpi, а не диапазону dpi.

person Tenfour04    schedule 25.02.2014