`

自定义ActionBar的MenuItem和给ActionBar中的按钮添加旋转动画(刷新动画)

 
阅读更多

        本文首先讲述如何给actionBar中的menuItem按钮添加旋转动画,然后引申出如何自定义MenuItem,即自定义MenuItem的布局。

       

        1.如何给MenuItem添加旋转动画(刷新动画)

         在项目中,我们会遇到这样的情况:在Actionbar上放一个刷新按钮用来刷新页面内容,但是点击后并没有一个刷新的旋转动画,经常需要给刷新按钮添加旋转动画。那么如何添加该动画效果呢?

       首先,是Menu的布局,都设置成以ActionBar的形式显示,如下:  

       

res/menu/menu_personalize_channel.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:xxx="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" >

    <item
        android:id="@+id/channel_action_refresh"
        android:icon="@drawable/refreshnormal"
        android:orderInCategory="0"
        android:title="@string/refresh"
        xxx:showAsAction="ifRoom|withText"/>

</menu>

 

     然后我们需要一个View来显示旋转动画:res/layout/action_view.xml

       

res/layout/action_view.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/xxx.actionBar.buttonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/contentDescription"
    android:scaleType="centerInside" />

       

       最后是如何设置动画了:

      

........

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.menu_personalize_channel, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.channel_action_refresh:
			startRotateAni(item);
			onRefresh();
			break;
		case android.R.id.home:
			onClose();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}


     private void startRotateAni(MenuItem item) {
          mRefreshItem = item;
        
        //这里使用一个ImageView设置成MenuItem的ActionView,这样我们就可以使用这个ImageView显示旋转动画了
          ImageView refreshActionView = (ImageView) getLayoutInflater().inflate(R.layout.action_view, null);
          refreshActionView.setImageResource(R.drawable.refreshnormal);
          mRefreshItem.setActionView(refreshActionView);
        
	 Animation rotateAni = AnimationUtils.loadAnimation(this,
				R.anim.rotateanim);
		LinearInterpolator lin = new LinearInterpolator();
		rotateAni.setInterpolator(lin);	
		item.setCheckable(false);// 在扫描时不接受任何点击事件
		refreshActionView.startAnimation(rotateAni);
	}
	
     private void stopRotateAni(){		
        if ( mRefreshItem != null) {
           mRefreshItem.setCheckable(true);
            View view =  mRefreshItem.getActionView();
            if (view != null) {
                view.clearAnimation();
                mRefreshItem.setActionView(null);
            }
        }
	}


    ......

 

        这样刷新效果实现了。

 

       2.自定义MenuItem

          项目中,我们也经常需要自定义Menu的布局,应该actionbar提供的默认的Menu布局远不能满足要求,例如:menuItem需要同时显示ICON和文字,可能你会说设置xxx:showAsAction="ifRoom|withText"就可以了,其实不然,这样设置后,只有在横屏下才能显示文本,竖屏下是不能显示的。

          那么如何实现自定义布局呢?

          有上面的讲解后,实现自定义布局其实很简单,如下:

          

          首先,修改res/layout/action_view.xml的布局如下:

          

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/action_refresh"
    style="@style/funshion.actionBar.buttonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ic_refresh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/contentDescription"
        android:scaleType="centerInside"
        android:src="@drawable/refreshnormal" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="2dp"
        android:paddingRight="3dp"
        android:text="@string/refresh" />

</LinearLayout>

       

           然后修改代码如下:

           

.......	
	
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
	    getMenuInflater().inflate(R.menu.menu_personalize_channel, menu);
            //这里使用一个ImageView设置成MenuItem的ActionView,这样我们就可以使用这个ImageView显示旋转动画了       
            refreshActionView = (LinearLayout) getLayoutInflater().inflate(R.layout.action_view, null);
            refreshActionView.setOnClickListener(this);
            refreshIcon = (ImageView) refreshActionView.findViewById(R.id.ic_refresh);
            refreshIcon.setImageResource(R.drawable.refreshnormal);
            mRefreshItem = menu.findItem(R.id.channel_action_refresh).setActionView(refreshActionView);
	    return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.channel_action_refresh:
		   //startRotateAni();
		   //onRefresh();
			break;
		case android.R.id.home:
			onClose();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

       	@Override
	public void onClick(View v) {
	       switch (v.getId()) {
		  case R.id.action_refresh:
		   startRotateAni();
		   onRefresh();
		      break;
		   default:
		      break;
		}
	}
     private void startRotateAni() { 
        
	  Animation rotateAni = AnimationUtils.loadAnimation(this,
				R.anim.rotateanim);
	  LinearInterpolator lin = new LinearInterpolator();
	  rotateAni.setInterpolator(lin);	
	  mRefreshItem.setCheckable(false);// 在扫描时不接受任何点击事件
	  refreshActionView.setClickable(false);
	  refreshIcon.startAnimation(rotateAni);
	}
	
     private void stopRotateAni(){		
           if ( mRefreshItem != null) {
        	mRefreshItem.setCheckable(true);
                View view =  mRefreshItem.getActionView();
                if (view != null) {
            	    view.setClickable(true);
            	    ImageView refreshIcon = (ImageView) view.findViewById(R.id.ic_refresh);
                    refreshIcon.clearAnimation();
                    // mRefreshItem.setActionView(null);
            }
        }
	}

       最后效果图如下:

       

 

          

  • 大小: 35 KB
分享到:
评论

相关推荐

    android自定义actionbar

    2. **自定义布局**:如果默认的ActionBar功能不能满足需求,可以创建一个自定义布局,并通过`setCustomView()`方法将其设置到ActionBar中。在自定义布局中,你可以添加按钮、TextView或其他视图元素,实现更多个性化...

    自定义actionbar的一个比较容易理解的例子

    在Android应用开发中,ActionBar是一个重要的组件,它位于应用程序界面的顶部,通常用来展示应用的标识、导航选项以及操作按钮。本示例将探讨如何自定义ActionBar,使其更符合应用的个性化需求。自定义ActionBar可以...

    自定义组件实现ActionBar

    6. **菜单项**:如果你需要在ActionBar中展示菜单项,需要在Activity的`onCreateOptionsMenu()`方法中创建菜单资源,然后在`onOptionsItemSelected(MenuItem item)`方法中处理点击事件。 7. **扩展功能**:还可以...

    自定义ActionBar

    这需要实现`SupportActionBar`的`setSupportActionBar()`方法的`setDisplayHomeAsUpEnabled()`和`setHomeButtonEnabled()`,并在`onOptionsItemSelected(MenuItem item)`中处理HomeAsUp按钮的点击。 8. **过渡动画*...

    Android源代码:自定义的actionbar搜索框CustomSearchView-master

    然后在Activity的布局文件或代码中,将CustomSearchView添加到Action Bar中,可能使用MenuItem的setActionView()方法,或者通过ToolBar的菜单项设置。 3. **搜索功能实现** 自定义的SearchView不仅涉及UI层面,还...

    android actionbar简单实例

    6. **创建菜单资源**:如果你希望在ActionBar中添加更多的菜单项,可以在res/menu目录下创建一个新的XML文件,比如menu_main.xml,定义菜单项。然后在MainActivity中重写`onCreateOptionsMenu(Menu menu)`方法加载这...

    自定义actionBar

    除了样式,还可以通过Java代码或者XML布局来添加自定义的菜单项、logo和工具栏按钮。在`menu`目录下创建一个`menu.xml`文件,定义菜单项: ```xml xmlns:app="http://schemas.android.com/apk/res-auto"&gt; ...

    actionbar中增加setting菜单 自定义

    通过以上步骤,我们就成功地在`ActionBar`中添加了一个自定义的`Setting`菜单,并使用`PopupWindow`实现了自定义的操作逻辑。这种方式既保持了界面的整洁,又提供了丰富的交互体验。在实际项目中,你可以根据需要在`...

    安卓自定义actionbar

    在本主题中,我们将深入探讨如何在Android应用中自定义Action Bar,以及如何利用ActionBar Sherlock库进行兼容性处理。 Action Bar的主要功能包括显示应用图标、标题、菜单项以及页签等。开发者可以通过自定义...

    actionbar demo

    这篇文章详细解释了如何在Android应用中实现和自定义ActionBar,可能包括设置标题、添加菜单项、改变主题颜色、处理选项点击事件等内容。通过阅读这篇文章,开发者可以了解到ActionBar的基本用法以及一些高级特性。 ...

    actionbar 入门儿 demo

    1. 使用Spinner:可以通过`setSpinner()`方法在ActionBar中添加下拉列表,实现切换不同视图或数据的功能。 2. 实现Overflow Menu:对于屏幕空间有限的设备,部分Action Items会移至Overflow Menu。可以通过`android...

    实现ActionBar自定义样式效果

    对于ActionBar上的菜单项(ActionItems),可以通过在`menu.xml`文件中定义,然后在Activity中重写`onOptionsItemSelected(MenuItem item)`方法来处理点击事件。此外,也可以通过`app:actionLayout`属性自定义...

    Android ActionBar Demo

    这个"Android ActionBar Demo"旨在展示如何在Android应用中有效地利用和自定义ActionBar,以提升用户体验。 首先,我们需要理解ActionBar的基本结构。它通常包含应用的Logo或Title、导航模式(如 tabs 或 spinner)...

    ActionBar+侧滑第三方框架

    5. **动画和过渡**:为了提供良好的用户体验,侧滑菜单的打开和关闭通常伴随着平滑的过渡动画,这些可以通过库内置的设置或者自定义动画来实现。 总的来说,`ActionBar`和侧滑第三方框架是Android应用开发中的核心...

    ActionBar示例

    - ActionView可以直接在ActionBar中显示自定义视图,如搜索框。 8. **使用AppCompat库** - 对于支持较低API级别的设备,可以使用AppCompat库中的`AppCompatActivity`,它包含了对ActionBar的支持。 9. **...

    actionbar练习

    这个“actionbar练习”显然是一份关于如何使用和自定义Android Action Bar的示例项目。下面,我们将深入探讨ActionBar的核心概念、功能以及如何在实际应用中进行定制。 1. **ActionBar的基本概念**: - ActionBar...

    Android ActionBar学习源代码

    9. **Overflow Menu**:对于没有物理菜单键的设备,ActionBar中的三个点表示Overflow Menu,包含了不显示在Action Bar上的菜单项。 10. **使用Toolbar替代ActionBar**:自Android 5.0(API Level 21)开始,推荐...

    ActionBar中的下拉菜单操作

    在ActionBar中添加下拉菜单,通常有两种方式:使用Spinner或使用PopupMenu。我们先来看Spinner的实现: 1. **使用Spinner**: - 在XML布局文件中创建Spinner,并为其指定适配器。适配器通常是一个ArrayAdapter,它...

    ActionBar详解

    5. **支持搜索**:可以通过添加搜索框,使用户能够直接在ActionBar中进行搜索。 ### 二、设置ActionBar 在Android Studio中,设置ActionBar主要通过以下步骤: 1. **启用ActionBar**:如果你使用的是...

Global site tag (gtag.js) - Google Analytics