Android 中的自定义按钮动画

Custom Button Animation in Android

在我的应用程序中,当用户按下菜单中的按钮时,我希望按钮缩放到更大的尺寸,然后当释放按钮时,它需要缩放回原来的尺寸。在 xml 中,我创建了以下动画器:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">

    <objectAnimator
        android:propertyName="scaleX"
        android:duration="100"
        android:valueFrom="1.0"
        android:valueTo="1.3"
        android:valueType="floatType"/>

    <objectAnimator
        android:propertyName="scaleY"
        android:duration="100"
        android:valueFrom="1.0"
        android:valueTo="1.3"
        android:valueType="floatType"/>

</set>

在 Android 开发者页面上,它说您可以为自定义按钮创建状态列表,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/button_focused"
          android:state_focused="true" />
    <item android:drawable="@drawable/button_default" />
</selector>

我有自定义背景,所以我的问题是:有没有办法将我的动画应用到像这样的状态列表中的可绘制对象?或者我是否必须将动画应用到我的 Java 代码中的每个按钮?我的应用程序有很多按钮,因此在 Java 中为每个按钮单独设置动画会变得很长。如果我必须在 Java 代码中应用动画,按钮的 onclick 方法只会在按钮被释放时调用,我如何检测按钮何时被按下?

添加onTouchListener:

 button.setOnTouchListener(new View.OnTouchListener()
 {
                @Override
                public boolean onTouch(View v, MotionEvent event) 
                {

                  if (event.getAction() == MotionEvent.ACTION_DOWN)
                   {
                      here the button is pressed down
                   }



                    return false;
                }
            });

你可以这样做:

  1. 创建文件 button_state_list_anim.xml 并将其放入 anim 文件夹(如果没有,请在 res 文件夹中创建)
  2. 将这些行添加到文件中:

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="true"
        android:state_pressed="true">
        <set>
            <objectAnimator
                android:duration="100"
                android:propertyName="scaleX"
                android:valueTo="1.3"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="100"
                android:propertyName="scaleY"
                android:valueTo="1.3"
                android:valueType="floatType" />
        </set>
    </item>
    <!-- base state -->
    <item android:state_enabled="true">
        <set>
            <objectAnimator
                android:duration="100"
                android:propertyName="scaleX"
                android:startDelay="100"
                android:valueTo="1"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="100"
                android:propertyName="scaleY"
                android:startDelay="100"
                android:valueTo="1"
                android:valueType="floatType" />
        </set>
    </item>
    <item>
        <set>
            <objectAnimator
                android:duration="0"
                android:propertyName="scaleX"
                android:valueTo="1"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="0"
                android:propertyName="scaleY"
                android:valueTo="1"
                android:valueType="floatType" />
        </set>
    </item>
    

  3. 在您使用按钮的布局文件中,添加android:stateListAnimator= "@anim/custom_button_state_list_anim_material",例如

    <Button android:id="@+id/animated_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:stateListAnimator="@anim/custom_button_state_list_anim_material" android:text="Animated button" />