我想在复选框中添加一些材质外观。我想使用自定义drawables将checkmark drawable从一个状态动画到另一个状态。我试图为ImageView
(看它是否有效)和CheckedTextView
(这是我真正需要的)制作动画。
为了做到这一点,我在布局中创建了两个视图,并将android:onClick
分别设置为自定义方法animateImage(View v)
和animateChecked(View v)
。我的问题是,第二个不起作用,尽管两者之间的唯一区别是我如何得到并设置我需要的可绘制。
layout.xml
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:src="@drawable/checkbox_off" <!-- static png showing the unchecked mark -->
android:clickable="true"
android:onClick="animateImage"/>
<CheckedTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/impo8"
android:gravity="center_vertical|left"
android:checked="false"
android:clickable="true"
android:CheckMark="@drawable/checkbox_off" <!-- again -->
android:onClick="animateChecked" />
活性
public void animateImage(View v) {
ImageView iv = (ImageView)v;
iv.setBackgroundResource(R.drawable.animation_checkbox_on);
AnimationDrawable adOn = (AnimationDrawable)iv.getBackground();
adOn.setColorFilter(getResources().getColor(R.color.static), PorterDuff.Mode.SRC_IN);
adOn.start();
}
public void animateChecked(View v) {
CheckedTextView c = (CheckedTextView)v;
c.setCheckMarkDrawable(R.drawable.animation_checkbox_on);
AnimationDrawable ad = (AnimationDrawable) c.getCheckMarkDrawable();
ad.setColorFilter(getResources().getColor(R.color.static), PorterDuff.Mode.SRC_IN);
ad.start();
}
当然,在两种方法中使用的 animation_checkbox_on 是具有静态png和持续时间的动画列表xml资源。我希望尽可能简单(甚至没有实现“if checked”语句)。
如上所述:第一种方法有效,ImageView正确动画;第二种方法不起作用,复选标记保持不变。我的代码中是否存在某种概念错误,或者我在某处错了?如何在CheckedTextView
标记上进行此操作?
我没有收到Android Studio的任何警告。谢谢。
/抽拉/ animation_checkbox_on
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item
android:drawable="@drawable/checkbox_off2" android:duration="50" />
<item
android:drawable="@drawable/checkbox_off3" android:duration="50" />
<item
android:drawable="@drawable/checkbox_on" android:duration="50" />
修改
我注意到动画列表中的第一项实际加载了。此外,如果我删除行ad.start()
(!)。
看起来setCheckMarkDrawable
或getCheckMarkDrawable
只返回动画列表的第一项,因此无效ad.start()
,并将动画转换为简单的可绘制开关。
如果这是真的,问题将是如何动画CheckedTextView。我已经读过关于在应用下一个drawable之前手动暂停线程一段时间了,但这对我来说似乎不是最好的选择。