You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:29:42