刷新菜单项动画ActionBarSherlock(Refresh menu item animati

2019-07-04 02:40发布

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

    case android.R.id.home:
        return true;

    case R.id.searchIcon:
        return true;

    case R.id.startRefresh:
        refreshItem = item;
        refresh();
        return true;
    case R.id.stopRefresh:

        if (refreshItem != null && refreshItem.getActionView() != null) {
            refreshItem.getActionView().clearAnimation();
            refreshItem.setActionView(null);
        }
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}


public void refresh() {
    if (FeedActivity.this != null) {
        /*
         * Attach a rotating ImageView to the refresh item as an ActionView
         */
        LayoutInflater inflater = (LayoutInflater) FeedActivity.this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ImageView iv = (ImageView) inflater.inflate(
                R.layout.refresh_action_view, null);
        Animation rotation = AnimationUtils.loadAnimation(
                FeedActivity.this, R.anim.clockwise_refresh);
        rotation.setRepeatCount(Animation.INFINITE);
        iv.startAnimation(rotation);
        refreshItem.setActionView(iv);
    }
}

点击之前:

点击后:

这里的图标被动画(旋转)。

问题:

为什么它转移到左侧?

一旦转移到左侧,图标变得不点击的,奇怪的设备后退按钮也不起作用

编辑:

在这个回答下面的评论:

动画图标ActionItem

杰克说的Warton如果您正在使用的菜单项的平方和大小正确的图标,你不会得到这个怪异的行为,给谁的人有同样的问题。

但我它使用MDPI可绘制的设备上使用32×32的图像。 这是说要有工作:(

谢谢

编辑:

refresh_action_view.xml

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

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

<style name="My_solid_ActionBar" parent="@style/Widget.Sherlock.Light.ActionBar.Solid.Inverse">
    <item name="background">@drawable/ab_solid_My</item>
    <item name="backgroundStacked">@drawable/ab_stacked_solid_My</item>
    <item name="backgroundSplit">@drawable/ab_bottom_solid_My</item>
    <item name="progressBarStyle">@style/My_ProgressBar</item>
    <item name="android:background">@drawable/ab_solid_My</item>
    <item name="android:backgroundStacked">@drawable/ab_stacked_solid_My</item>
    <item name="android:backgroundSplit">@drawable/ab_bottom_solid_My</item>
    <item name="android:progressBarStyle">@style/My_ProgressBar</item>
</style>

Answer 1:

问题是,你不处理所有菜单通胀onCreateOptionsMenu() 基本逻辑的ActionBar我已经在使用开源应用见过使用刷新动画,例如Andlytics (也用自己在项目),是实现booleanonCreateOptionsMenu()来决定是否显示刷新动画。

你可以这样实现它:当你的refresh()方法被调用,它设置boolean isRefreshing标志设置为true,并调用inValidateOptionsMenu()这“幕后”调用onCreateOptionsMenu()启动动画:

充气菜单中onCreateOptionsMenu(...)

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    super.onCreateOptionsMenu(menu, inflater);
    //inflate a menu which shows the non-animated refresh icon
    inflater.inflate(R.menu.my_ab_menu, menu);

    if (isRefreshing) {
        //if we're refreshing, show the animation
        MenuItem item = menu.findItem(R.id.refreshMenuItem);
        item.setActionView(R.layout.action_bar_indeterminate_progress);
        ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView);
        ((AnimationDrawable) iv.getDrawable()).start();
    }
}

启动动画像这样:

 public void refresh(){
        isRefreshing = true;
        inValidateOptionsMenu();
    }

如果你希望用户时,他拿出刷新图标启动动画,做这样的onOptionsItemSelected()

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

要停止动画电话:

isRefreshing = false;
invalidateOptionsMenu();

此代码是从一个Fragment ,所以你可能有,如果一个来调整Activity ,但我认为它传达的基本理念。



Answer 2:

我想你使用完全相同的代码和它的作品对我蛮好。 这可能是不同的唯一事情是两件事情:

1)refresh_action_view布局(这里是我比较):

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_menu_refresh" />

2)你的动作条的显示选项(这是我的styles.xml进行比较)。

<resources>

<style name="AppTheme" parent="Theme.Sherlock.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/Widget.ActionBar</item>
    <item name="actionBarStyle">@style/Widget.ActionBar</item>
</style>

<style name="Widget.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
    <item name="android:displayOptions">showHome|useLogo|showCustom</item>
    <item name="displayOptions">showHome|useLogo|showCustom</item>
</style>

</resources>

你可以分享你的呢?



文章来源: Refresh menu item animation in ActionBarSherlock