经常看到很多应用会在Actionbar上放一个刷新按钮用来刷新页面内容,但是点击后并没有一个刷新的旋转动画,感觉少点什么,那我们就给它加一个旋转动吧!
首先是菜单布局,有两个菜单,都设置成以Actionbar的方式显示,其中一个为刷新菜单:
res/menu/main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/air_traffic"
android:icon="@drawable/ic_action_airtraffic"
android:showAsAction="always">
</item>
<item
android:id="@+id/refresh"
android:icon="@drawable/ic_action_refresh"
android:showAsAction="always">
</item>
</menu>
然后我们需要一个View来显示旋转动画:
res/layout/action_view.xml
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"style="@android:style/Widget.ActionButton"
android:layout_width="wrap_content"
android:scaleType="centerInside"
android:layout_height="wrap_content" />
然后就是我们的主窗体啦:
MainActivity.java
import android.os.Bundle;import android.annotation.SuppressLint;
import android.app.Activity;
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 Activity {
protected MenuItem refreshItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh:
showRefreshAnimation(item);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@SuppressLint("NewApi")
private void showRefreshAnimation(MenuItem item) {
hideRefreshAnimation();
refreshItem = item;
//这里使用一个ImageView设置成MenuItem的ActionView,这样我们就可以使用这个ImageView显示旋转动画了
ImageView refreshActionView = (ImageView) getLayoutInflater().inflate(R.layout.action_view, null);
refreshActionView.setImageResource(drawable.ic_action_refresh);
refreshItem.setActionView(refreshActionView);
//显示刷新动画
Animation animation = AnimationUtils.loadAnimation(this, anim.refresh);
animation.setRepeatMode(Animation.RESTART);
animation.setRepeatCount(Animation.INFINITE);
refreshActionView.startAnimation(animation);
}
@SuppressLint("NewApi")
private void hideRefreshAnimation() {
if (refreshItem != null) {
View view = refreshItem.getActionView();
if (view != null) {
view.clearAnimation();
refreshItem.setActionView(null);
}
}
}
}
实现的效果: