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;
}
});
你可以这样做:
- 创建文件
button_state_list_anim.xml
并将其放入 anim
文件夹(如果没有,请在 res
文件夹中创建)
将这些行添加到文件中:
<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>
在您使用按钮的布局文件中,添加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"
/>
在我的应用程序中,当用户按下菜单中的按钮时,我希望按钮缩放到更大的尺寸,然后当释放按钮时,它需要缩放回原来的尺寸。在 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;
}
});
你可以这样做:
- 创建文件
button_state_list_anim.xml
并将其放入anim
文件夹(如果没有,请在res
文件夹中创建) 将这些行添加到文件中:
<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>
在您使用按钮的布局文件中,添加
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" />