首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android RatingBar:如果我自定义它的颜色,它无法填充部分ratingBar

Android RatingBar:如果我自定义它的颜色,它无法填充部分ratingBar
EN

Stack Overflow用户
提问于 2016-08-03 13:39:19
回答 4查看 2.3K关注 0票数 10

我已经将ratingBar的颜色设置为不同的颜色,以安卓的默认蓝色和灰色-我已经使我的星星的黑色背景和粉红色,如果他们被选中。

这是我的主要活动代码:

代码语言:javascript
运行
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingbar);
        LayerDrawable layerDrawable2 = (LayerDrawable) ratingBar.getProgressDrawable();
        DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0)),
                ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark));
        DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1)),
                ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); // Partial star
        DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2)),
                ContextCompat.getColor(getApplicationContext(), R.color.colorAccent));
        ratingBar.setIsIndicator(false);
        ratingBar.setRating(3.6f);
        ratingBar.setStepSize(0.1f);
        ratingBar.invalidate();
        ratingBar.setIsIndicator(true);
    }
}

你可以看到,如果我把评级定为3.6,它会选择最多4。

然而,如果我注释掉我自己定制的颜色,ratingBar将自己正确地设置为只显示第四颗恒星的一部分,就像传递给它的值是3.6:

代码语言:javascript
运行
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingbar);
/*        LayerDrawable layerDrawable2 = (LayerDrawable) ratingBar.getProgressDrawable();
        DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0)),
                ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark));
        DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1)),
                ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); // Partial star
        DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2)),
                ContextCompat.getColor(getApplicationContext(), R.color.colorAccent));*/
        ratingBar.setIsIndicator(false);
        ratingBar.setRating(3.6f);
        ratingBar.setStepSize(0.1f);
        ratingBar.invalidate();
        ratingBar.setIsIndicator(true);
    }
}

为什么如果我创建自己的自定义颜色,ratingBar本身就无法正常填充?

我已经创建了一个小型回购程序,您可以在这里下载并测试它:https://github.com/Winghin2517/RatingBarTest2

编辑:

FlyingPumba的图书馆展示了一些我想要达到的目标,但我需要一种风格,即当星星出现在屏幕上时,它的背景是白色的,当用户按下星星时,它将被一种坚实的颜色填充。在我的例子中,我希望它充满绿色。

以下是我所能达到的目标,但它还没有完全实现。我把星体坐成粉红色的滚动视图背景改为粉红色,这样你就可以看到不是星星的白色背景,而是滚动视图背景中的粉红色。对于我的用例,我希望白色的星星坐在一个图像视图的前面,我不希望图像视图中的图像在星星中闪耀。

另外,我根本不需要星星的白笔,因为我想保持星星的造型简单。

代码语言:javascript
运行
复制
<com.iarcuschin.simpleratingbar.SimpleRatingBar
    android:id="@+id/ratingBar3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    app:srb_rating="3.6"
    app:srb_fillColor="@color/material_greenA700"
    app:srb_borderColor="@color/material_white"
    app:srb_starBorderWidth="0"
    app:srb_pressedFillColor="@color/material_greenA700"
    app:srb_starSize="30dp"
    />

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-14 07:49:10

你的尝试是正确的。你做错的唯一一件事就是把错误的颜色分配到第二个可绘制的地方。

把第二张图想象成星星的背景,而不是前景。因此,部分恒星需要背景颜色,而不是恒星的颜色,例如,黑色,而不是粉红色。

下面是经过修正的代码,其工作原理如下所述。我对其稍作了修改,以突出所需的更改。

代码语言:javascript
运行
复制
    RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingbar);
    LayerDrawable layerDrawable2 = (LayerDrawable) ratingBar.getProgressDrawable();

    // No star
    DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0)),
            ContextCompat.getColor(getApplicationContext(),
                    android.R.color.background_dark));

    // Partial star 
    DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1)),
            ContextCompat.getColor(getApplicationContext(),
                    // use background_dark instead of colorAccent
                    // R.color.colorAccent));
                    android.R.color.background_dark));

    // Custom star
    DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2)),
            ContextCompat.getColor(getApplicationContext(),
                    R.color.colorAccent));

另一种方法(在很多情况下可能更好)是在RatingBar上使用适当的样式。

这需要为评等栏设置自定义样式,然后定义该样式用于指向您自己的图像或颜色的图层绘图。

我不打算进一步详细介绍,因为实际的xml代码如Anantham的回答所示

票数 4
EN

Stack Overflow用户

发布于 2016-08-13 07:11:25

在Activity.java中:

oncreate:

代码语言:javascript
运行
复制
       RatingBar   setRatingBar = (RatingBar) findViewById(R.id.setRating);
       float rating = Float.parseFloat(listString);
      // onRatingChanged(setRatingBar, 0.0f, true);

        public void onRatingChanged(RatingBar rateBar, float rating, boolean fromUser) {
    try {
        DecimalFormat decimalFormat = new DecimalFormat("#.#");
        curRate = Float.valueOf(decimalFormat.format((curRate * count + rating)/ ++count));
        float userRatePoint = curRate/**20*/;

        setRatingBar.setRating(userRatePoint);
        countText = (TextView) findViewById(R.id.countText);
        countText.setText(userRatePoint + " Ratings");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

然后试试这个小明星评级栏:

代码语言:javascript
运行
复制
    <RatingBar
     android:id="@+id/setRating"
     style="?android:attr/ratingBarStyleSmall"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginLeft="10dp"
     android:layout_marginTop="3dp"
     android:isIndicator="true"
     android:numStars="5"
     android:stepSize="0.1" />
       //if you want to style please use "foodRatingBar"
       //for custom star image use  "ratingstar"

style.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="foodRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:progressDrawable">@drawable/ratingstar</item>
    <item name="android:minHeight">22dip</item>
    <item name="android:maxHeight">22dip</item>
</style>

值v11/styes.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="foodRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:progressDrawable">@drawable/ratingstar</item>
    <item name="android:minHeight">22dip</item>
    <item name="android:maxHeight">22dip</item>
</style>

值v14/styes.xml

代码语言:javascript
运行
复制
 <resources>
   <style name="foodRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:progressDrawable">@drawable/ratingstar</item>
    <item name="android:minHeight">22dip</item>
    <item name="android:maxHeight">22dip</item>
</style>
<!--
    Base application theme for API 14+. This theme completely replaces
    AppBaseTheme from BOTH res/values/styles.xml and
    res/values-v11/styles.xml on API 14+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <!-- API 14 theme customizations can go here. -->
</style>
</resources>

ratingstar.xml --这是定义自定义进度映像的地方。

代码语言:javascript
运行
复制
<?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/ratingstar_default" />
        <item android:id="@android:id/secondaryProgress"
            android:drawable="@drawable/ratingstar_default" />
        <item android:id="@android:id/progress"
            android:drawable="@drawable/ratingstar_selected" />
    </layer-list>
</resources>
票数 1
EN

Stack Overflow用户

发布于 2016-08-06 15:44:01

您只需要用DrawableCompat.wrap(..)更新可绘制的.mutate()。您的代码如下所示:

代码语言:javascript
运行
复制
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0).mutate()),
            ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark));
    DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1).mutate()),
            ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); // Partial star
    DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2).mutate()),
            ContextCompat.getColor(getApplicationContext(), R.color.colorAccent));

如果动态地改变颜色,则绘图必须是可变的

见问题:Android:使用DrawableCompat调色

答:https://stackoverflow.com/a/30928051/2949612

您可以看到Romain的可绘制突变博客,也可以看到变异()方法android。

我希望它能帮到你。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38745313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档