动作栏中的动画图标跳跃并变大

时间:2016-03-03 22:35:14

标签: android menu jquery-animate

我在Actionbar中使用一个图标进行刷新,点击刷新按钮后它正在循环播放,但它跳跃并变得比菜单图标大得多。

菜单和刷新图标:

menu and refresh icon

点击后的菜单状态:

menu status after clicking

代码如下:

MainActivity.java

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    // Our created menu to use
    private Menu mymenu;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setIcon(R.drawable.ic_people);
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        // We should save our menu so we can use it to reset our updater.
        mymenu = menu;
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.action_refresh:
                // Do animation start





                //TODO trigger loading


                LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                ImageView iv = (ImageView)inflater.inflate(R.layout.iv_refresh,null);
                Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotate_refresh);
                rotation.setRepeatCount(Animation.INFINITE);

                iv.startAnimation(rotation);

                item.setActionView(iv);

                new UpdateTask(this).execute();
                return true;
            case R.id.home:
                Intent intent=new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
                return true;
        }
        return super.onOptionsItemSelected(item);

    }
    public void resetUpdating()
    {
        // Get our refresh item from the menu
        MenuItem m = mymenu.findItem(R.id.action_refresh);
        if(m.getActionView()!=null)
        {
            // Remove the animation.
            m.getActionView().clearAnimation();
            m.setActionView(null);
        }
    }
}

iv_refresh.xml

    <?xml version="1.0" encoding="utf-8"?>
    <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        style="@android:style/Widget.ActionButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="-40dp"
        android:paddingLeft="-40dp"
        android:contentDescription="@string/app_name"
        android:src="@drawable/refresh" />

rotate_refresh.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360"/>

menu_main.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"
    tools:context="com.google.myapplication.MainActivity">


    <item
        android:id="@+id/action_refresh"
        app:showAsAction="always"
        android:title="Refresh"
        android:icon="@drawable/refresh"/>

</menu>

1 个答案:

答案 0 :(得分:0)

尝试执行以下操作:

1-添加菜单项

的xml属性
android:actionLayout="@layout/iv_refresh"

<item
        android:id="@+id/action_refresh"
        app:showAsAction="always"
        android:title="Refresh"
        android:actionLayout="@layout/iv_refresh"
        android:icon="@drawable/refresh"/>

2-选择onOptionsItemSelected

中的项目
    case R.id.action_refresh:
       ImageView iv = (ImageView) item.getActionView();

    Animation rotation = AnimationUtils.loadAnimation(this,  R.anim.rotate_refresh);
    rotation.setRepeatCount(Animation.INFINITE);

    iv.startAnimation(rotation);