2016-03-03 76 views
0

我正在使用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> 

回答

0

尝试执行以下操作:

1-添加XML属性的菜单项

android:actionLayout="@layout/iv_refresh" 

到当在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); 
选择项目是

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

2-

+0

感谢您的回复,但它不适用于设置两次imageView。 ImageView iv =(ImageView)inflater ... – Patzu

+0

item.setActionView(iv); – Patzu

+0

我的意思是不要膨胀编程式。我编辑我的回答 – Jamal