Arc*_*pgc 10 animation android actionbarsherlock
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);
}
}
Run Code Online (Sandbox Code Playgroud)
点击之前:

点击后:

这里的图标正在动画(旋转).
问题:
它为什么向左移?
一旦它向左移动,图标变得不可点击,奇怪的是设备后退按钮也不起作用
编辑:
在下面的评论中这个答案:
Jake Warton说如果你使用方形和正确大小的图标作为菜单项,你就不会对遇到同样问题的人产生这种奇怪的行为.
但我在使用mdpi drawables的设备上使用32x32图像.如上所述必须工作:(
谢谢
编辑:
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" />
Run Code Online (Sandbox Code Playgroud)
自定义样式我在我的应用程序中使用
<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>
Run Code Online (Sandbox Code Playgroud)
问题是你没有处理所有的菜单膨胀onCreateOptionsMenu().ActionBar我在开源应用程序中使用的刷新动画的基本逻辑,例如Andlytics(以及我自己在项目中使用),是实现一个boolean标志onCreateOptionsMenu()来决定是否显示刷新动画.
您可以像这样实现它:当您的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();
}
}
Run Code Online (Sandbox Code Playgroud)
像这样开始动画:
public void refresh(){
isRefreshing = true;
inValidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)
如果您希望用户在点击刷新图标时启动动画,请执行以下操作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();
//...
Run Code Online (Sandbox Code Playgroud)
要停止动画调用:
isRefreshing = false;
invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)
这段代码来自于一个,Fragment所以你可能不得不调整一下Activity,但我认为它传达了基本的想法.
| 归档时间: |
|
| 查看次数: |
13353 次 |
| 最近记录: |