在运行时更改形状纯色

时间:2015-03-27 22:32:31

标签: android layout drawable shape

我的Drawable xml文件代表我的自定义进度条:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/background">
    <shape
        android:innerRadiusRatio="3"
        android:shape="ring"
        android:useLevel="false"
        android:thicknessRatio="6.4">
        <solid android:color="@android:color/transparent" />
        <stroke 
            android:width="2dp"
            android:color="@android:color/darker_gray" />
    </shape>
</item>
<item android:id="@+id/progress">
    <rotate
        android:fromDegrees="270"
        android:toDegrees="270">
        <shape
            android:innerRadiusRatio="3"
            android:shape="ring"
            android:thicknessRatio="7.0">
            <solid
                android:id="@+id/progressColor"
                android:color="#FBB817" />
        </shape>
    </rotate>
  </item>
</layer-list>

在这里使用:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="150dip"
    android:id="@+id/relativeLayout">

    <ProgressBar
        android:id="@+id/progressBar"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="150dip"
        android:layout_height="150dip"
        android:layout_centerHorizontal="true"
        android:indeterminate="false"
        android:progressDrawable="@drawable/progressbar" />

    <TextView
        android:id="@+id/tvProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="progress" />

</RelativeLayout>

我需要在运行时根据某些条件更改标识为progressColor的纯色。在这里尝试了一切,对我来说没有任何作用。有什么建议?

我试图改变它:

LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(R.drawable.progressbar);
layerDrawable.setDrawableByLayerId(R.id.progressColor, new ColorDrawable(Color.BLUE));
progressBar.setProgressDrawable(layerDrawable);

但它没有改变任何东西。

我在这里找到了解决方案:

View v = findViewById(R.id.relativeLayout);
LayerDrawable layerDrawable = (LayerDrawable) v.getBackground();
final GradientDrawable shape = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.progressColor);
shape.setColor(Color.BLACK);

但这只会让我的应用崩溃。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,但它并不完美,但它可以解决问题。

首先制作另一种具有不同进展色的drawable。

progressbar1.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/background">
    <shape
        android:innerRadiusRatio="3"
        android:shape="ring"
        android:thicknessRatio="6.4"
        android:useLevel="false">
        <solid android:color="@android:color/transparent" />
        <stroke
            android:width="2dp"
            android:color="@android:color/darker_gray" />
    </shape>
</item>
<item android:id="@+id/progress">
    <rotate
        android:fromDegrees="270"
        android:toDegrees="270">
        <shape
            android:id="@+id/shape"
            android:innerRadiusRatio="3"
            android:shape="ring"
            android:thicknessRatio="7.0">
            <solid
                android:id="@+id/progressColor"
                android:color="#111" />
        </shape>
    </rotate>
</item>

然后当您需要它时,在绘制进度条之前,只需使用以下代码更改drawable:

Drawable drawable = getResources().getDrawable(R.drawable.progressbar1);
progressBar.setProgressDrawable(drawable);