android – 在ActionBarSherlock中刷新菜单项动画

前端之家收集整理的这篇文章主要介绍了android – 在ActionBarSherlock中刷新菜单项动画前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. public boolean onOptionsItemSelected(MenuItem item) {
  2. switch (item.getItemId()) {
  3.  
  4. case android.R.id.home:
  5. return true;
  6.  
  7. case R.id.searchIcon:
  8. return true;
  9.  
  10. case R.id.startRefresh:
  11. refreshItem = item;
  12. refresh();
  13. return true;
  14. case R.id.stopRefresh:
  15.  
  16. if (refreshItem != null && refreshItem.getActionView() != null) {
  17. refreshItem.getActionView().clearAnimation();
  18. refreshItem.setActionView(null);
  19. }
  20. return true;
  21. default:
  22. return super.onOptionsItemSelected(item);
  23. }
  24. }
  25.  
  26.  
  27. public void refresh() {
  28. if (FeedActivity.this != null) {
  29. /*
  30. * Attach a rotating ImageView to the refresh item as an ActionView
  31. */
  32. LayoutInflater inflater = (LayoutInflater) FeedActivity.this
  33. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  34. ImageView iv = (ImageView) inflater.inflate(
  35. R.layout.refresh_action_view,null);
  36. Animation rotation = AnimationUtils.loadAnimation(
  37. FeedActivity.this,R.anim.clockwise_refresh);
  38. rotation.setRepeatCount(Animation.INFINITE);
  39. iv.startAnimation(rotation);
  40. refreshItem.setActionView(iv);
  41. }
  42. }

点击前:

点击后:

这里的图标正在动画(旋转).

问题:

为什么会向左转?

一旦它向左移动,该图标变得不可点击,并且奇怪的是,设备返回按钮也不起作用

编辑:

在这个答案下面的评论中:

Animated Icon for ActionItem

杰克·沃顿(Jake Warton)说如果您正在使用正方形和正确尺寸的图标,那么您就不会再遇到这个奇怪的行为,对于有同样问题的人来说.

但是我在使用mdpi drawables的设备上使用32×32映像.其中哪一个必须工作:(

谢谢

编辑:

refresh_action_view.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
  3. style="@style/Widget.Sherlock.ActionButton"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"
  6. android:src="@drawable/ic_refresh" />

我在我的应用程序中使用自定义样式

  1. <style name="My_solid_ActionBar" parent="@style/Widget.Sherlock.Light.ActionBar.Solid.Inverse">
  2. <item name="background">@drawable/ab_solid_My</item>
  3. <item name="backgroundStacked">@drawable/ab_stacked_solid_My</item>
  4. <item name="backgroundSplit">@drawable/ab_bottom_solid_My</item>
  5. <item name="progressBarStyle">@style/My_ProgressBar</item>
  6. <item name="android:background">@drawable/ab_solid_My</item>
  7. <item name="android:backgroundStacked">@drawable/ab_stacked_solid_My</item>
  8. <item name="android:backgroundSplit">@drawable/ab_bottom_solid_My</item>
  9. <item name="android:progressBarStyle">@style/My_ProgressBar</item>
  10. </style>

解决方法

问题是您没有处理onCreateOptionsMenu()中的所有菜单通胀. ActionBar刷新动画的基本逻辑是在开放源代码的应用程序中使用,例如 Andlytics(也用于项目中),是在onCreateOptionsMenu()中实现一个布尔标志来决定是否显示刷新动画.

您可以这样实现:当您调用refresh()方法时,将布尔值isRefreshing标志设置为true,并调用onCreateOptionsMenu()后面的inValidateOptionsMenu()来启动动画:

在onCreateOptionsMenu(…)中填充菜单

  1. @Override
  2. public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
  3. menu.clear();
  4. super.onCreateOptionsMenu(menu,inflater);
  5. //inflate a menu which shows the non-animated refresh icon
  6. inflater.inflate(R.menu.my_ab_menu,menu);
  7.  
  8. if (isRefreshing) {
  9. //if we're refreshing,show the animation
  10. MenuItem item = menu.findItem(R.id.refreshMenuItem);
  11. item.setActionView(R.layout.action_bar_indeterminate_progress);
  12. ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView);
  13. ((AnimationDrawable) iv.getDrawable()).start();
  14. }
  15. }

开始动画如下:

  1. public void refresh(){
  2. isRefreshing = true;
  3. inValidateOptionsMenu();
  4. }

如果您希望用户在点击刷新图标时启动动画,请在onOptionsItemSelected()中执行此操作:

  1. case R.id.refreshMenuItem:
  2. isRefreshing = true;
  3. item.setActionView(R.layout.action_bar_indeterminate_progress);
  4. ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView);
  5. ((AnimationDrawable) iv.getDrawable()).start();
  6. //...

停止动画通话:

  1. isRefreshing = false;
  2. invalidateOptionsMenu();

这段代码来自一个Fragment,所以你可能需要调整一个Activity,但是我认为它会传达一个基本的想法.

猜你在找的Android相关文章