具有淡入/淡出持续时间的Android选择器最初不可见

时间:2014-01-13 07:09:32

标签: android android-drawable

我试图实现ActionBar中的图标不会离散地改变状态,而是通过淡化动画。当我将android:enterFadeDurationandroid:exitFadeDuration添加到选择标记时,我的drawable最初是不可见的 - 当我点击它时,它会将状态更改为state_pressed(正确地输入淡出持续时间)当我释放它时,它会回到正常的可见未选择状态。

我必须遗漏一些明显的东西,或者这是某种错误?

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="150" android:exitFadeDuration="150">
    <item android:drawable="@drawable/filters_toggle_icon_selected" android:state_focused="true"/>
    <item android:drawable="@drawable/filters_toggle_icon_selected" android:state_pressed="true"/>
    <item android:drawable="@drawable/filters_toggle_icon" android:state_focused="false" android:state_pressed="false"/>
</selector>

3 个答案:

答案 0 :(得分:5)

我有一个类似的问题,我的代码看起来像这样:

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
          android:enterFadeDuration="@android:integer/config_mediumAnimTime"
          android:exitFadeDuration="@android:integer/config_mediumAnimTime" >
    <item android:state_pressed="true" android:drawable="@color/pressed" />
    <item android:drawable="@color/default" />
</selector>

起初,我发现了一个提示,要求摆脱enterFadeDuration并仅使用exitFadeDuration。这解决了初始隐形问题,但在第一次交互过程中,视图仍然逐渐变为隐形。

然后,我修改我的结构如下:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/default" />
    <item>
        <selector android:enterFadeDuration="@android:integer/config_mediumAnimTime"
                  android:exitFadeDuration="@android:integer/config_mediumAnimTime" >
            <item android:state_pressed="true" android:drawable="@color/pressed" />
        </selector>
    </item>
</layer-list>

基本上,我只是将默认的drawable推出选择器。这是一种解决方法,它也适用于具有多种状态的选择器,但有一些值得注意的限制:

  • 默认可绘制 始终可见作为底层。它适用于不透明的颜色,但透明度可能会导致不良结果。
  • 如果选择器测试的状态之一中的视图开始,仍然会将显示为默认,因为选择器仍然以不可见的方式启动。

可能不适用于原始问题,但要克服选择器的这种行为需要考虑。

答案 1 :(得分:3)

使用Regex regex = new Regex("(?=" + startTag + ")[A-Za-z0-9\-]+(?<=" + endTag + ")"); android:enterFadeDuration="@android:integer/config_mediumAnimTime"

答案 2 :(得分:-1)

这似乎是在特定Android版本上发生的错误。您可以使用Java代码以编程方式关闭android:enterFadeDuration,方法是使用Selector访问StateListDrawable

// Disable android:enterFadeDuration/exitFadeDuration on Android 4.2 only
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1) {
    StateListDrawable stateListDrawable =
            (StateListDrawable) animatedButton.getBackground();
    stateListDrawable.setEnterFadeDuration(0);
    stateListDrawable.setExitFadeDuration(0);
}