我基本上遵循这个答案来制作刷新菜单按钮的动画,唯一的区别是我使用的是AppCompat v7.22而不是ActionBarSherlock。
我的应用中有一个工具栏定义为(布局/工具栏.xml)
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
我的菜单包含与刷新/同步按钮(菜单/menu_list.xml)对应的项目:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
// ...
<item android:id="@+id/sync"
android:title="Sincronizar"
app:showAsAction="always"
android:icon="@drawable/ic_action_refresh" />
// ...
</menu>
以及将要动画的视图(布局/iv_sync.xml):
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Widget.AppCompat.ActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_refresh" />
按下同步按钮时,我将上述视图设置为项目的操作视图并对其进行动画处理(ListActivity.java):
private void startSyncAnimation() {
MenuItem menuItem = myMenu.findItem(R.id.sync);
ImageView iv = (ImageView) getLayoutInflater().inflate(R.layout.iv_sync, null);
menuItem.setActionView(iv); // this does nothing to the UI!
Animation rotate = AnimationUtils.loadAnimation(this, R.anim.rotate);
rotate.setRepeatCount(Animation.INFINITE);
iv.startAnimation(rotate);
}
当我检查它是否有效时,我不会显示旋转动画代码。问题显然是行menuItem.setActionView(iv)
,尽管它正在设置操作视图(menuItem.getActionView() 将正确返回),但对 UI 没有任何作用。
我的目标是 API 22,最小值是 API 16。关于可能是什么问题的任何想法?
在动画初始化后,您是否尝试将 .setActionView() 调用移动到末尾?
MenuItem item = getToolbar().getMenu().findItem(Menu.FIRST);
Animation animation = new RotateAnimation(0.0f, 360.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
animation.setDuration(700);
animation.setRepeatCount(Animation.INFINITE);
ImageView imageView = new ImageView(this);
imageView.setImageDrawable(UIHelper.getIcon(this, MMEXIconFont.Icon.mmx_refresh));
imageView.startAnimation(animation);
item.setActionView(imageView);