本文首先讲述如何给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); } } }
最后效果图如下:
相关推荐
2. **自定义布局**:如果默认的ActionBar功能不能满足需求,可以创建一个自定义布局,并通过`setCustomView()`方法将其设置到ActionBar中。在自定义布局中,你可以添加按钮、TextView或其他视图元素,实现更多个性化...
在Android应用开发中,ActionBar是一个重要的组件,它位于应用程序界面的顶部,通常用来展示应用的标识、导航选项以及操作按钮。本示例将探讨如何自定义ActionBar,使其更符合应用的个性化需求。自定义ActionBar可以...
6. **菜单项**:如果你需要在ActionBar中展示菜单项,需要在Activity的`onCreateOptionsMenu()`方法中创建菜单资源,然后在`onOptionsItemSelected(MenuItem item)`方法中处理点击事件。 7. **扩展功能**:还可以...
这需要实现`SupportActionBar`的`setSupportActionBar()`方法的`setDisplayHomeAsUpEnabled()`和`setHomeButtonEnabled()`,并在`onOptionsItemSelected(MenuItem item)`中处理HomeAsUp按钮的点击。 8. **过渡动画*...
然后在Activity的布局文件或代码中,将CustomSearchView添加到Action Bar中,可能使用MenuItem的setActionView()方法,或者通过ToolBar的菜单项设置。 3. **搜索功能实现** 自定义的SearchView不仅涉及UI层面,还...
6. **创建菜单资源**:如果你希望在ActionBar中添加更多的菜单项,可以在res/menu目录下创建一个新的XML文件,比如menu_main.xml,定义菜单项。然后在MainActivity中重写`onCreateOptionsMenu(Menu menu)`方法加载这...
除了样式,还可以通过Java代码或者XML布局来添加自定义的菜单项、logo和工具栏按钮。在`menu`目录下创建一个`menu.xml`文件,定义菜单项: ```xml xmlns:app="http://schemas.android.com/apk/res-auto"> ...
通过以上步骤,我们就成功地在`ActionBar`中添加了一个自定义的`Setting`菜单,并使用`PopupWindow`实现了自定义的操作逻辑。这种方式既保持了界面的整洁,又提供了丰富的交互体验。在实际项目中,你可以根据需要在`...
在本主题中,我们将深入探讨如何在Android应用中自定义Action Bar,以及如何利用ActionBar Sherlock库进行兼容性处理。 Action Bar的主要功能包括显示应用图标、标题、菜单项以及页签等。开发者可以通过自定义...
这篇文章详细解释了如何在Android应用中实现和自定义ActionBar,可能包括设置标题、添加菜单项、改变主题颜色、处理选项点击事件等内容。通过阅读这篇文章,开发者可以了解到ActionBar的基本用法以及一些高级特性。 ...
1. 使用Spinner:可以通过`setSpinner()`方法在ActionBar中添加下拉列表,实现切换不同视图或数据的功能。 2. 实现Overflow Menu:对于屏幕空间有限的设备,部分Action Items会移至Overflow Menu。可以通过`android...
对于ActionBar上的菜单项(ActionItems),可以通过在`menu.xml`文件中定义,然后在Activity中重写`onOptionsItemSelected(MenuItem item)`方法来处理点击事件。此外,也可以通过`app:actionLayout`属性自定义...
这个"Android ActionBar Demo"旨在展示如何在Android应用中有效地利用和自定义ActionBar,以提升用户体验。 首先,我们需要理解ActionBar的基本结构。它通常包含应用的Logo或Title、导航模式(如 tabs 或 spinner)...
5. **动画和过渡**:为了提供良好的用户体验,侧滑菜单的打开和关闭通常伴随着平滑的过渡动画,这些可以通过库内置的设置或者自定义动画来实现。 总的来说,`ActionBar`和侧滑第三方框架是Android应用开发中的核心...
- ActionView可以直接在ActionBar中显示自定义视图,如搜索框。 8. **使用AppCompat库** - 对于支持较低API级别的设备,可以使用AppCompat库中的`AppCompatActivity`,它包含了对ActionBar的支持。 9. **...
这个“actionbar练习”显然是一份关于如何使用和自定义Android Action Bar的示例项目。下面,我们将深入探讨ActionBar的核心概念、功能以及如何在实际应用中进行定制。 1. **ActionBar的基本概念**: - ActionBar...
9. **Overflow Menu**:对于没有物理菜单键的设备,ActionBar中的三个点表示Overflow Menu,包含了不显示在Action Bar上的菜单项。 10. **使用Toolbar替代ActionBar**:自Android 5.0(API Level 21)开始,推荐...
在ActionBar中添加下拉菜单,通常有两种方式:使用Spinner或使用PopupMenu。我们先来看Spinner的实现: 1. **使用Spinner**: - 在XML布局文件中创建Spinner,并为其指定适配器。适配器通常是一个ArrayAdapter,它...
5. **支持搜索**:可以通过添加搜索框,使用户能够直接在ActionBar中进行搜索。 ### 二、设置ActionBar 在Android Studio中,设置ActionBar主要通过以下步骤: 1. **启用ActionBar**:如果你使用的是...