如何通过ObjectAnimator实现Drawable动画?按钮选中态矢量图缩放问题
实现按钮选中状态下矢量Drawable的缩放动画
看起来你想给按钮的矢量Drawable做选中状态的缩放动画,但直接在<selector>里嵌套ObjectAnimator是行不通的——Android的StateListDrawable(也就是<selector>对应的Drawable类型)不支持在<item>标签里直接包含动画相关的标签。我给你两种靠谱的实现方案:
方案一:使用AnimatedStateListDrawable(推荐)
这是Android官方提供的专门用于状态切换带动画的Drawable,完美适配你的需求。
步骤1:创建AnimatedStateListDrawable的XML文件
在res/drawable目录下新建animated_map_drawable.xml:
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定义未选中状态的Drawable --> <item android:id="@+id/state_unselected" android:drawable="@drawable/ic_map_default" android:state_selected="false"/> <!-- 定义选中状态的Drawable --> <item android:id="@+id/state_selected" android:drawable="@drawable/ic_map_colored" android:state_selected="true"/> <!-- 从未选中到选中的缩放动画 --> <transition android:fromId="@+id/state_unselected" android:toId="@+id/state_selected"> <set> <objectAnimator android:duration="150" android:propertyName="scaleX" android:valueFrom="1" android:valueTo="2" android:valueType="floatType"/> <objectAnimator android:duration="150" android:propertyName="scaleY" android:valueFrom="1" android:valueTo="2" android:valueType="floatType"/> </set> </transition> <!-- 从选中到未选中的缩放动画 --> <transition android:fromId="@+id/state_selected" android:toId="@+id/state_unselected"> <set> <objectAnimator android:duration="150" android:propertyName="scaleX" android:valueFrom="2" android:valueTo="1" android:valueType="floatType"/> <objectAnimator android:duration="150" android:propertyName="scaleY" android:valueFrom="2" android:valueTo="1" android:valueType="floatType"/> </set> </transition> </animated-selector>
步骤2:给按钮设置这个Drawable
在布局文件里给按钮指定该Drawable(这里以drawableTop为例,你可以根据实际位置调整):
<Button android:id="@+id/map_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableTop="@drawable/animated_map_drawable" android:text="Map"/>
步骤3:处理按钮的选中状态切换
在代码里给按钮添加点击事件,切换选中状态即可:
val mapButton = findViewById<Button>(R.id.map_button) mapButton.setOnClickListener { view -> view.isSelected = !view.isSelected }
方案二:手动用ObjectAnimator控制动画
如果需要更灵活的动画控制(比如添加插值器、组合其他动画),可以通过代码监听按钮状态变化,手动启动动画。
代码示例:
val mapButton = findViewById<Button>(R.id.map_button) // 初始化动画集合 val scaleAnimatorSet = AnimatorSet() val scaleXAnim = ObjectAnimator.ofFloat(mapButton.drawableTop, "scaleX", 1f, 2f) val scaleYAnim = ObjectAnimator.ofFloat(mapButton.drawableTop, "scaleY", 1f, 2f) scaleAnimatorSet.playTogether(scaleXAnim, scaleYAnim) scaleAnimatorSet.duration = 150 // 监听按钮选中状态变化 mapButton.setOnClickListener { view -> view.isSelected = !view.isSelected if (view.isSelected) { // 切换到选中状态的Drawable并播放放大动画 mapButton.setDrawableTopResource(R.drawable.ic_map_colored) scaleAnimatorSet.setFloatValues(1f, 2f) scaleAnimatorSet.start() } else { // 切换到未选中状态的Drawable并播放缩小动画 mapButton.setDrawableTopResource(R.drawable.ic_map_default) scaleAnimatorSet.setFloatValues(2f, 1f) scaleAnimatorSet.start() } }
注意:如果你的按钮是CheckBox或ToggleButton,可以改用setOnCheckedChangeListener来监听状态变化,逻辑保持一致。
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

