Android animation Vector Drawable不能正常工作

2022-01-28 09:23:33 标签 androidanimatedvectordrawable

我有下面的ImageView

<androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/image_header_toggle"
        android:layout_width="28dp"
        android:layout_height="28dp"
        android:layout_marginEnd="10dp"
        app:layout_constraintBottom_toBottomOf="@+id/text_header_name"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@+id/text_header_name"
        android:src="@drawable/ic_header_off_to_on"
        app:tint="?attr/colorPrimary"/>

以及两个我通过https://shapeshifter。design/制作的动画绘图

ic_header_off_to_on。xml

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector
            android:name="vector"
            android:width="24dp"
            android:height="24dp"
            android:viewportWidth="24"
            android:viewportHeight="24">
            <group
                android:name="group"
                android:pivotX="12"
                android:pivotY="12">
                <path
                    android:name="path_1"
                    android:pathData="M 15.41 16.58 L 10.83 12 L 15.41 7.41 L 14 6 L 8 12 L 14 18 L 15.41 16.58 Z"
                    android:fillColor="#000"
                    android:strokeWidth="1"/>
            </group>
        </vector>
    </aapt:attr>
    <target android:name="group">
        <aapt:attr name="android:animation">
            <objectAnimator
                android:propertyName="rotation"
                android:duration="300"
                android:valueFrom="0"
                android:valueTo="-90"
                android:valueType="floatType"
                android:interpolator="@android:interpolator/fast_out_slow_in"/>
        </aapt:attr>
    </target>
</animated-vector>

ic_header_on_to_off。xml

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector
            android:name="vector"
            android:width="24dp"
            android:height="24dp"
            android:viewportWidth="24"
            android:viewportHeight="24">
            <group
                android:name="group"
                android:pivotX="12"
                android:pivotY="12"
                android:rotation="270">
                <path
                    android:name="path_1"
                    android:pathData="M 15.41 16.58 L 10.83 12 L 15.41 7.41 L 14 6 L 8 12 L 14 18 L 15.41 16.58 Z"
                    android:fillColor="#000"
                    android:strokeWidth="1"/>
            </group>
        </vector>
    </aapt:attr>
    <target android:name="group">
        <aapt:attr name="android:animation">
            <objectAnimator
                android:propertyName="rotation"
                android:duration="300"
                android:valueFrom="270"
                android:valueTo="0"
                android:valueType="floatType"
                android:interpolator="@android:interpolator/fast_out_slow_in"/>
        </aapt:attr>
    </target>
</animated-vector>

以及我用来切换图标的代码

val res = if (isExpanded) R.drawable.ic_header_off_to_on else R.drawable.ic_header_on_to_off
    
image_header_toggle.setImageResource(res)
(view.image_header_toggle.drawable as? AnimatedVectorDrawable)?.start()
image_header_toggle.setOnClickListener { isExpanded = !isExpanded }

off_to_on动画似乎很好地发挥,但on_to_off一个不是图像简单地得到替换。

它看起来是这样的

###我刚刚发现了这个问题,并尝试了一些方法。一个更优雅的解决方案是删除您的Kotlin code with mine. This will achieve a smooth transition and you even can change the duration of it. I和我的代码。这将实现一个平稳的过渡,你甚至可以改变它的持续时间。而不是需要2个绘制,你可以只使用一个。如果你正在使用Fragment instead of Activity don't forget to set view.findViewById instead of findViewById:

而不是Activity don't forge别忘了设置view.findViewById instead of fin而不是findViewById:

class MainActivity : AppCompatActivity() {
    private var isExpanded = true
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val imageView = findViewById<ImageView>(R.id.image_header_toggle)
        imageView.setOnClickListener {
            if (!isExpanded) {
                imageView.animate().apply {
                duration = 500
                rotation(0f)
                isExpanded = true}
            }else{
                imageView.animate().apply {
                duration = 500
                rotation(-90f)
                isExpanded = false}
            }
        }
    }
}
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码