Проблема масштабирования экрана Android RatingBar

Мне интересно, кто-нибудь сможет мне помочь, пожалуйста. У меня возникла проблема с масштабированием при работе с пользовательским RatingBar при отображении на экранах с разной плотностью. Я создал быстрый пример проекта, чтобы объяснить мою проблему. Это очень простой проект, который на данный момент касается только больших размеров экрана, независимо от плотности Структура папки проекта.

Как вы можете видеть на изображении, у меня есть селекторы, которые будут использоваться для RatingBar, а затем у меня есть стандартное и полное изображение для двух отдельных RatingBar в каждой из папок с большой плотностью рисования (на данный момент все изображения одного размера). Чтобы показать этот пользовательский RatingBar. Я попытался заставить эти RatingBars отображаться правильно и попробовал два отдельных способа, как указано ниже. В первом случае я попытался указать ширину и высоту RatingBars в файле макета, как показано ниже:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RatingBar 
        android:id="@+id/rb_test_1"           
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="150dp"
        android:layout_height="111dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_rb_test_1" />

    <RatingBar 
        android:id="@+id/rb_test_2"           
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="200dp"
        android:layout_height="154dp"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_rb_test_2" />

</LinearLayout>

При просмотре графического макета графического интерфейса пользователя получается следующий вывод, отображаемый на базовом размере экрана 10.1 по сравнению с Nexus 10. Кажется, что изображение дублируется и растягивается.

TestScaling-10-дюймовые экраны-SpecifyingSize

Теперь, когда я пробую второй способ, который больше похож на то, как я хотел бы это сделать (не указывая точный размер каждого из RatingBars, просто устанавливая ширину и высоту макета для переноса, следующее код:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RatingBar 
        android:id="@+id/rb_test_1"           
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_rb_test_1" />

    <RatingBar 
        android:id="@+id/rb_test_2"           
        android:numStars="1"
        android:rating="0.5"
        android:stepSize="0.01"
        android:isIndicator="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:gravity="bottom"                                                          
        android:progressDrawable="@drawable/selector_rb_test_2" />

</LinearLayout>

При просмотре графического макета графического интерфейса получается следующий вывод, отображаемый на экране с базовым размером 10,1 по сравнению с Nexus 10. Это обрезает нижнюю часть изображения для RatingBar.

TestScaling-10-дюймовые экраны-WrappingContent

Все, что я хочу сделать, это без проблем отображать несколько RatingBars независимо от плотности экрана. Может ли кто-нибудь помочь мне понять, почему он отображается по-разному на экране Nexus10 и как это исправить? Я застрял на этом некоторое время и был бы очень благодарен, если бы кто-нибудь смог пролить свет. Заранее большое спасибо.


person Graham Baitson    schedule 02.05.2014    source источник
comment
Первое, что бросилось мне в глаза, это то, что вы установили minWidth на 150dp: android:minWidth="150dp", а maxWidth — только на 111dp: android:maxWidth="111dp". То же самое и с высотой. Почему бы вам просто не установить ширину и высоту на фиксированный размер? Вот так: android:layout_width="150dp" android:layout_height="111dp".   -  person Xaver Kapeller    schedule 03.05.2014
comment
Большое спасибо за комментарий. Я проверю это первым делом утром и дам вам знать, а также поменяюсь местами для установки ширины и высоты макета, как вы предложили. Я надеюсь, что указанный выше минимум и максимум были просто опечаткой, и я указал минимальную и максимальную высоту на 111, а минимальную и максимальную ширину на 150. Первым делом я проверю. Большое спасибо, что нашли время, чтобы оставить комментарий.   -  person Graham Baitson    schedule 03.05.2014
comment
Привет @XaverKapeller, я обновил код, но все еще безуспешно, как описано в сообщении ниже. У вас есть другие идеи?   -  person Graham Baitson    schedule 03.05.2014
comment
Хорошо, тогда я думаю, что проблема, скорее всего, в ваших ресурсах. Вы уверены, что правильно отмасштабировали изображение для всех плотностей пикселей?   -  person Xaver Kapeller    schedule 03.05.2014
comment
Извините, @XaverKapeller, я отредактировал вопрос выше и удалил сообщение с ответом ниже. Когда вы говорите масштабировать изображение для всех плотностей пикселей. У меня есть только одна папка в моем приложении, которую я должен отображать для всех больших размеров экрана. Как мне убедиться, что это отображается в пределах ширины и высоты, если у меня есть изображения разного размера? При работе с простыми изображениями это довольно просто, потому что все, что вам нужно сделать, это установить свойство scaletype для изображения, и оно будет масштабироваться в зависимости от плотности экрана, но вы не можете сделать это с RatingBar, вы должны указать точные w и h?   -  person Graham Baitson    schedule 03.05.2014
comment
Я имею в виду, что в ваших ресурсах у вас должно быть 4 разные версии вашего изображения в 4 разных папках. Каждая из этих версий имеет разное разрешение, и Android выберет правильное изображение для плотности пикселей вашего устройства. Если разрешение одного из этих 4 изображений неправильное, на некоторых устройствах изображение будет иметь другой размер.   -  person Xaver Kapeller    schedule 03.05.2014
comment
Извините за все вопросы, я немного новичок в разных размерах экрана и плотности. Итак, у меня есть панель рейтинга с 7 разными изображениями разной ширины и высоты. То, что я изначально хотел сделать, это не указывать размер, а просто обернуть ширину и высоту содержимого. Но когда я это делаю, изображения большего размера обрезаются пополам. Вот когда я начинаю использовать указанную ширину и высоту. Итак, с четырьмя разными папками, указанными выше, нужно ли указывать изображение разного размера для каждой плотности для больших устройств (например, drawable-xlarge-xhdpi, drawable-xlarge-mdpi и т. д.)?   -  person Graham Baitson    schedule 03.05.2014
comment
Вам нужны папки drawable-mdpi, drawable-hdpi, drawable-xhdpi и drawable-xxhdpi. Дополнительную информацию можно найти здесь.   -  person Xaver Kapeller    schedule 03.05.2014
comment
Что вы имеете в виду, что у вас есть 7 разных изображений, и что вы имеете в виду, что они все разных размеров?   -  person Xaver Kapeller    schedule 03.05.2014
comment
Извиняюсь, может я не ясно выразился. Я имел в виду, что использую несколько RatingBars, каждый из которых указывает другое изображение. Я обновил свой вопрос, чтобы отобразить две RatingBars с разными изображениями. Я создал 4 папки с возможностью рисования, которые вы указали выше, и поместил изображения (все одного размера), поэтому он должен вытягивать изображения в зависимости от плотности (но на данный момент все они будут одного размера). Я все еще, кажется, получаю ту же проблему.   -  person Graham Baitson    schedule 03.05.2014
comment
Вы не можете просто поместить их в эти папки, если они все одинакового размера, это означает, что на экранах с более низкой плотностью пикселей изображение будет казаться больше. Они должны быть правильно масштабированы, чтобы иметь одинаковый размер на всех устройствах. Это не так сложно, если у вас уже есть изображения, которые вы можете использовать Android Asset Studio или средство изменения размера изображений, входящее в состав Android SDK, чтобы изменить их размер до нужного.   -  person Xaver Kapeller    schedule 03.05.2014
comment
Хорошо, я попробую это в ближайшее время и дам вам знать, как это происходит. На первый взгляд, я не думаю, что получу именно то, что ищу, потому что я хочу, чтобы каждый из RatingBar был непосредственно рядом друг с другом, а все RatingBar были базовыми (все они находились в одной нижней точке). Я опасаюсь, что несколько RatingBars будут выглядеть слишком маленькими на некоторых больших экранах. Я попробую в ближайшее время и дам вам знать в любом случае. Большое спасибо за вашу помощь, я очень ценю это. Вернемся к вам в ближайшее время   -  person Graham Baitson    schedule 03.05.2014
comment
Просто используйте Android Asset Studio. или средство изменения размера изображения, чтобы масштабировать ваши изображения, а затем проверьте, устранена ли ваша проблема, результирующие изображения могут быть слишком маленькими, но если это решит ваши проблемы, мы знаем, что это проблема. После этого я могу помочь вам получить изображения до нужного размера.   -  person Xaver Kapeller    schedule 03.05.2014
comment
Привет @XaverKapeller, я поместил изображения в виде набора значков, поэтому он автоматически масштабировал изображения и помещал их в 4 папки. Так что сейчас это выглядит нормально для 10-дюймовых экранов, но на экране Nexus 7 нижняя половина обрезана. Я также скачал инструмент (например, github.com/asystat/Final-Android-Resizer ), который был рекомендован в другом потоке для масштабирования изображений. Когда я использую это для масштабирования изображений, все размеры экрана показывают наполовину обрезанное изображение. Это кошмар для работы, это так сложно. Я действительно застрял здесь, чтобы любая группа изображений работала для нескольких RatingBars :-/   -  person Graham Baitson    schedule 03.05.2014
comment
Привет @XaverKapeller, хорошо, я наконец понял концепцию создания изображений разного размера для каждого из экранов разного размера. Я масштабировал свои изображения рейтинга для каждой из плотностей (например, ldpi 0,75, mdpi 1 -> xxxdpi 4). Так что теперь это нормально для 10-дюймовых экранов. Но проблема, с которой я столкнулся сейчас, заключается в том, что на экранах меньшего размера hdpi отображается слишком большая полоса рейтинга, как мне убедиться, что она хорошо выглядит на экранах меньшего размера с более высокой плотностью? Я борюсь здесь, поэтому, если вы хотите дать мне оценку времени, мы можем что-то решить, отправив код и т. Д.?   -  person Graham Baitson    schedule 11.05.2014
comment
Что именно вы имеете в виду? Если вы используете dp и все изображения правильно масштабированы, то вид должен быть одинаковой высоты на всех дисплеях.   -  person Xaver Kapeller    schedule 11.05.2014
comment
Да, я использую dp, и я почти уверен, что изображения масштабируются правильно в соответствии с коэффициентами масштабирования. Но, скажем, на 10-дюймовом mdpi мои рейтинговые полосы выглядят идеально. Но скажем, на большом экране mdpi (например, 5,1 дюйма) он будет отображать те же изображения, что и 10-дюймовый mdp, поэтому ширина экрана слишком мала для отображения всех изображений. И мне не хватает последней картинки. Затем, по мере того, как вы идете на меньший экран, я пропускаю все больше и больше всех 7 полос рейтинга? Я все понимаю или я еще не до конца понял??   -  person Graham Baitson    schedule 12.05.2014
comment
Привет, @XaverKapeller, спасибо за помощь в решении этой проблемы. Однако я исправил эту проблему, но все еще не получил желаемого эффекта. Я собираюсь закрыть этот вопрос (поскольку вы помогли мне решить эту проблему), но я собираюсь открыть новый вопрос с новой проблемой, которая у меня возникла — показано здесь: stackoverflow.com/q/23664132/1634369. Спасибо за вашу помощь   -  person Graham Baitson    schedule 15.05.2014
comment
Привет @XaverKapeller, я собираюсь назначить награду за другой вопрос (ссылка выше), если вы хотите попытаться решить проблему для меня? Я также предоставил ссылку на код на Github, если у вас есть время для загрузки. Спасибо   -  person Graham Baitson    schedule 16.05.2014


Ответы (1)


Следуя приведенным выше комментариям @Xavers, эта проблема возникла из-за неправильного масштабирования изображений. Решение этой проблемы состоит в том, чтобы следовать коэффициентам масштабирования, как представлено в следующем ответе: https://stackoverflow.com/a/11581786/1634369

ldpi | mdpi | tvdpi | hdpi | xhdpi | xxhdpi | xxxhdpi
0.75 | 1    | 1.33  | 1.5  | 2     | 3      | 4

Спасибо за вашу помощь @Xaver

person Graham Baitson    schedule 14.05.2014