我有一个带有自定义ImageView的活动和一个打开相同活动的新实例的按钮。单击ImageView启动AnimatedVectorDrawable的动画。
问题是,如果我在第一个活动中播放动画,它将以结束状态出现在下一个活动中。如果我不会在第一次活动中播放动画或使用常规ImageView,则不会发生这种情况。
API 19中的AnimatedVectorDrawableCompat也不会发生此问题。
此行为的原因是什么?
活动:
class TestActivity: AppCompatActivity() {
companion object {
fun start(context: Context){
context.startActivity(Intent(context, TestActivity::class.java))
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
myImageView.setOnClickListener {
(myImageView.drawable as? Animatable)?.start()
}
button.setOnClickListener {
TestActivity.start(this)
}
}
}
自定义ImageView:
class MyImageView (context: Context, attrs: AttributeSet?) : ImageView(context, attrs) {
init {
val anim = ContextCompat.getDrawable(context, R.drawable.anim)
setImageDrawable(anim)
}
}
动画资源:
<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:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:name="path"
android:strokeColor="#fff"
android:strokeWidth="2"
android:pathData="M 3, 7 L 21, 7 M 3, 12 L 21, 12 M 3, 17 L 21, 17"/>
</vector>
</aapt:attr>
<target android:name="path" >
<aapt:attr name="android:animation">
<set android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<objectAnimator
android:duration="200"
android:propertyName="pathData"
android:valueFrom="M 3, 7 L 21, 7 M 3, 12 L 21, 12 M 3, 17 L 21, 17"
android:valueTo="M 5.5, 5.5 L 12,12 M 5.5, 18.5 L 18.5, 5.5 M 12,12 L 18.5, 18.5"
android:valueType="pathType"/>
</set>
</aapt:attr>
</target>
</animated-vector>
答案 0 :(得分:0)
您的自定义ImageView
必须扩展AppCompatImageView
。
在布局中使用常规ImageView
时,此方法可以很好地工作,因为AppCompat会自动将ImageView
替换为AppCompatImageView
。