Как создать панель пользовательских рейтингов в Android - PullRequest
69 голосов
/ 27 апреля 2011

Привет всем, что мне нужно для выполнения оценок в моем приложении ... ТАК, мне нужно создать собственную панель рейтингов ... Может ли кто-нибудь помочь мне в этом?

Ответы [ 13 ]

0 голосов
/ 06 апреля 2018

Вы можете использовать данное решение @erdomester для этого.Но если вы сталкиваетесь с проблемами с высотой строки рейтинга, то вы можете программно использовать высоту значков панели рейтинга.

В Kotlin,

val drawable = ContextCompat.getDrawable(context, R.drawable.rating_filled)
val drawableHeight = drawable.intrinsicHeight

rating_bar.layoutParams.height = drawableHeight
0 голосов
/ 19 июля 2014

При создании пользовательской рейтинговой линии, которая отображает сплошную градиентную линию, идущую по треку, похожему на SeekBar, а не по звездам, я также столкнулся с проблемой, связанной с вертикальным центрированием фона (прорисовка трека).Это некорректный отрисовываемый код, который я использовал изначально (который породил проблему), как было предложено разработчиком Android и другими записями StackOverflow:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/seekbar_track"/>
    <item android:id="@android:id/secondaryProgress">
        <scale
            android:drawable="@drawable/seekbar_progress2"
            android:scaleWidth="100%" />
    </item>

    <item android:id="@android:id/progress" >
        <clip android:clipOrientation="horizontal" android:gravity="left" >
            <shape>
                <gradient
                    android:startColor="@color/ratingbar_bg_start"
                    android:centerColor="@color/ratingbar_bg_center"
                    android:centerX="0.5"
                    android:endColor="@color/ratingbar_bg_end"
                    android:angle="0"
                    />
            </shape>
        </clip>
    </item>    

 </layer-list>

Проблема здесь заключается в первом элементе, который связан с фономПользовательский РейтингБар.Многие записи скажут вам установить для layout_minHeight какое-то большое значение, чтобы избежать вертикального пространственного разъединения между большим пальцем и его дорожкой.Для меня это не было решением - при просмотре на планшете фон все еще уменьшался до меньшего размера, основанного на телефоне - поэтому трек постоянно располагался значительно выше центра трека RatingBar.Решение состоит в том, чтобы удалить эту запись в рисованной области RatingBar, чтобы она теперь выглядела следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/secondaryProgress">
        <scale
            android:drawable="@drawable/seekbar_progress2"
            android:scaleWidth="100%" />
    </item>

    <item android:id="@android:id/progress" >
        <clip android:clipOrientation="horizontal" android:gravity="left" >
            <shape>
                <gradient
                    android:startColor="@color/ratingbar_bg_start"
                    android:centerColor="@color/ratingbar_bg_center"
                    android:centerX="0.5"
                    android:endColor="@color/ratingbar_bg_end"
                    android:angle="0"
                    />
            </shape>
        </clip>
    </item>    

 </layer-list>

Затем в определении стиля пользовательского RatingBar установите layout_background для рисованной дорожки.Мой выглядит следующим образом:

<style name="styleRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:background">@drawable/seekbar_track</item>
    <item name="android:progressDrawable">@drawable/abratingbar</item>
    <item name="android:thumb">@drawable/abseekbar_thumb</item>
    <item name="android:minHeight">@dimen/base_29dp</item>
    <item name="android:maxHeight">@dimen/base_29dp</item>
    <item name="android:layout_marginLeft">@dimen/base_10dp</item>
    <item name="android:layout_marginRight">@dimen/base_10dp</item>
    <item name="android:layout_marginTop">@dimen/base_10dp</item>
    <item name="android:layout_marginBottom">@dimen/base_10dp</item>
    <item name="android:scaleType">fitXY</item>
</style>

(Раньше настройка фона здесь была неопределенной.)1012 *

<RatingBar
    android:id="@+id/ratingbar_vote"
    style="@style/styleRatingBar"
    android:hint="@string/ratingbar_vote"
    android:contentDescription="@string/ratingbar_vote"
    android:numStars="5"
    android:rating="5"
    android:stepSize="1"
    android:layout_width="match_parent"
    android:layout_height="@dimen/base_29dp"
    android:layout_marginLeft="@dimen/base_120dp"
    android:layout_gravity="bottom|right" />

Итак, подведем итог: не устанавливайте фоновую функцию (дорожку) в настраиваемой рисованной панели RatingBar, установите ее в функции layout_background вашего пользовательского стиля RatingBar.Это гарантирует, что дорожка всегда центрирована вертикально в горизонтальной панели рейтинга.(Помните, что в этом пользовательском RatingBar вместо звездочек или других изолированных изображений в качестве рейтинга я использую градиентную линию, которая «растет» или «сжимается» по горизонтали для отображения рейтинга - в этой строке рейтинга используется большой палец, похожий на SeekBarработает на SeekBar-подобной "дорожке".)

0 голосов
/ 01 августа 2013

Вы можете иметь 5 изображений с изображением дефалюта в виде пустой звезды и заполнить строку рейтинга половиной или полным основанием изображения по рейтингу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...