以编程方式更改搜索栏的进度绘图

Posted

技术标签:

【中文标题】以编程方式更改搜索栏的进度绘图【英文标题】:Changing Progress Drawable of seekbar programmatically 【发布时间】:2012-09-26 09:30:34 【问题描述】:

在我的应用中,我有一个搜索栏,它应该有两种状态 - 聚焦和正常

我也没有像这样在 xml 中设置普通图像 -

<SeekBar
    android:id="@+id/bar"
    android:layout_
    android:layout_
    android:layout_marginLeft="114dp"
    android:layout_marginTop="210dp"
    android:max="60"
    android:progressDrawable="@drawable/bar_normal"
    android:thumb="@null" />

这是我用于进度可绘制的 xml

bar_normal.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/black"/>

    <item android:id="@android:id/secondaryProgress">
        <clip android:drawable="@drawable/black" />
    </item>

    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/grey" />
    </item>

</layer-list>

现在,当用户触摸此搜索栏时,我想将可绘制的进度更改为橙色

为此,我使用另一个 xml,并在我的代码中这样编写

seekBar.setProgressDrawable(getResources().getDrawable(R.drawable.bar_focused));

bar_focused.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/black"/>

    <item android:id="@android:id/secondaryProgress">
        <clip android:drawable="@drawable/black" />
    </item>

    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/orange" />
    </item>

</layer-list>

最初该栏看起来很好,进度显示为灰色和背景,第二进度显示为黑色,但是当我触摸搜索栏使其变为橙色时, 整个条变黑。它的工作仍然很好,但我看不到橙色。

【问题讨论】:

【参考方案1】:

您不能使用状态更改可绘制对象,让操作系统为您完成, android默认的seekbar drawable是:

    <item android:state_pressed="true"
          android:state_window_focused="true"
          android:drawable="@drawable/seek_thumb_pressed" />

    <item android:state_focused="true"
          android:state_window_focused="true"
          android:drawable="@drawable/seek_thumb_selected" />

    <item android:state_selected="true"
          android:state_window_focused="true"
          android:drawable="@drawable/seek_thumb_selected" />

    <item android:drawable="@drawable/seek_thumb_normal" />

</selector>

Ps:如果您的可绘制对象是图像或在 xml 中定义,则没有区别,它应该是 (bar_drawable.xml):

<item android:state_pressed="true"
      android:state_window_focused="true"
      android:drawable="@drawable/bar_focused" />

<item android:state_focused="true"
      android:state_window_focused="true"
      android:drawable="@drawable/bar_focused" />

<item android:state_selected="true"
      android:state_window_focused="true"
      android:drawable="@drawable/bar_focused" />

<item android:drawable="@drawable/bar_normal" />

【讨论】:

以上是关于以编程方式更改搜索栏的进度绘图的主要内容,如果未能解决你的问题,请参考以下文章

多个时如何以编程方式访问相对布局中的文本视图或进度条?

禁用客户端对搜索栏的更改

如何以编程方式将图像放入进度条(WPF)

javascript 以编程方式设置进度条宽度

如何使百分比指示器以编程方式在颤动中改变颜色?

如何更改 CircularProgress 栏的颜色