android - ActionItem 的动画图标

标签 android android-animation actionbarsherlock

我一直在到处寻找合适的解决方案来解决我的问题,但似乎还没有找到。我有一个 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/

相关文章:

java - ABS - fragment - 菜单膨胀问题

java - Firebase ValueEventListener onDataChange() 未被调用

Android Activity 过渡动画

android - 动画缩放故障

android - AutoCompleteTextView 无法正确显示带有 ActionBarSherlock 主题的文本

带主页按钮的 Android ABS 中心标题

android - listview 从在线 JSON 文件收到新数据后如何创建通知?

ListView 中的 Android 进度条始终不确定

android - 如何在 TextInputLayout 上设置 maxHeight

android - Imageview 中的并行动画