我一直在到处寻找合适的解决方案来解决我的问题,但似乎还没有找到。我有一个 ActionBar (ActionBarSherlock),其菜单是从 XML 文件扩展而来的,并且该菜单包含一个项目,并且该项目显示为 ActionItem。
菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_menu_refresh"
android:showAsAction="ifRoom"
android:title="Refresh"/>
</menu>
Activity :
[...]
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
[...]
ActionItem 显示为带有图标且没有文本,但是当用户单击 ActionItem 时,我希望图标开始动画,更具体地说,是原地旋转。有问题的图标是一个刷新图标。
我意识到 ActionBar 支持使用自定义 View ( Adding an Action View ) 但是此自定义 View 已扩展为覆盖 ActionBar 的整个区域并实际上阻止了除应用程序图标之外的所有内容寻找。
所以我接下来的尝试是尝试使用 AnimationDrawable 并逐帧定义我的动画,将 drawable 设置为菜单项的图标,然后在 onOptionsItemSelected(MenuItem item)
中获取图标并开始使用 ((AnimationDrawable)item.getIcon()).start()
制作动画。然而这并不成功。有谁知道实现这种效果的任何方法?
最佳答案
你在正确的轨道上。以下是 GitHub Gaug.es 应用程序将如何实现它。
首先他们定义了一个动画 XML:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="1000"
android:interpolator="@android:anim/linear_interpolator" />
现在为 Action View 定义一个布局:
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_refresh"
style="@style/Widget.Sherlock.ActionButton" />
我们需要做的就是在点击项目时启用此 View :
public void refresh() {
/* Attach a rotating ImageView to the refresh item as an ActionView */
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ImageView iv = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);
Animation rotation = AnimationUtils.loadAnimation(getActivity(), R.anim.clockwise_refresh);
rotation.setRepeatCount(Animation.INFINITE);
iv.startAnimation(rotation);
refreshItem.setActionView(iv);
//TODO trigger loading
}
加载完成后,只需停止动画并清除 View :
public void completeRefresh() {
refreshItem.getActionView().clearAnimation();
refreshItem.setActionView(null);
}
你就完成了!
一些额外的事情要做:
- 缓存 Action View 布局膨胀和动画膨胀。它们很慢,因此您只想执行一次。
- 在
completeRefresh()
中添加
null
检查
这是应用程序的拉取请求:https://github.com/github/gauges-android/pull/13/files
关于android - ActionItem 的动画图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9731602/