自定义RatingBar着色API< 21与支持库22.1.1

时间:2015-05-23 14:15:01

标签: android android-support-library android-drawable

我正在使用支持库22.1.1。我的目标是为自定义RatingBar着色,以避免在我的APK中包含多个图像。

着色在API 22上正确应用,但在API 19上没有。我希望它能用于API> = 16.请注意,我只是尝试着色“进度”,而不是完整的条形

这是RatingBar风格:

custom_ratingbar.xml

<?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/ic_heart_outline_grey600_24dp" /> <item android:id="@android:id/progress" android:drawable="@drawable/ic_heart_grey600_24dp" /> </layer-list> 文件:

android.support.v4.Fragment

它以这种方式应用于我的布局中,该布局位于扩展android.support.v7.app.AppCompatActivity的活动中的<RatingBar android:layout_width="wrap_content" android:layout_height="22dp" android:id="@+id/checkin_rating" style="@style/customRatingBar" android:isIndicator="true" android:numStars="5" android:stepSize="1" android:layout_marginBottom="8dp"/> 内部的片段中:

android:progressTint

我从lint工具收到一条警告,指出API&lt;不支持{{1}} 21.如果不使用多个drawables,有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:13)

使用支持库&gt; 22我设法使用getProgressDrawable

执行此操作
LayerDrawable stars = (LayerDrawable) bar.getProgressDrawable();
stars.getDrawable(0).setColorFilter(NONE_COLOR, PorterDuff.Mode.SRC_ATOP);
stars.getDrawable(1).setColorFilter(FULL_COLOR, PorterDuff.Mode.SRC_ATOP);
stars.getDrawable(2).setColorFilter(PARTIAL_COLOR, PorterDuff.Mode.SRC_ATOP);

这在支持库22之前没有用,所以我认为这样可以解决你的问题。

答案 1 :(得分:1)

我不想编辑已被接受的Gary的答案(如果我可以的话),但我发现FULL / PARTIAL / NONE的顺序对我来说不正确。这就是我实现它的方式,它适用于API 18 +。

将星形条(我的AppCompatRatingBar的子类)设置为黄色,灰色表示未填充的星星:

    int yellow = ContextCompat.getColor(getContext(), R.color.starbar_star_yellow);
    int gray = ContextCompat.getColor(getContext(), R.color.starbar_star_gray);

    Drawable starbarDrawable = this.getProgressDrawable();
    DrawableCompat.setTint(starbarDrawable, yellow); // this works for API 21+

    // this ensures it works for API 18-20
    if(starbarDrawable instanceof LayerDrawable) {
        LayerDrawable stars = (LayerDrawable) starbarDrawable;
        stars.getDrawable(0).setColorFilter(gray, PorterDuff.Mode.SRC_ATOP); // UNFILLED
        stars.getDrawable(1).setColorFilter(yellow, PorterDuff.Mode.SRC_ATOP); // PARTIAL OR FULL?
        stars.getDrawable(2).setColorFilter(yellow, PorterDuff.Mode.SRC_ATOP); // PARTIAL OR FULL?
    }