android之官方导航栏ActionBar(三)之高仿优酷首页
一、问题概述 |
通过上两篇文章,我们对如何使用ActionBar大致都已经有了认识。在实际应用中,我们更多的是定制ActionBar,那么就需要我们重写或者定义一些样式来修饰ActionBar,来满足具体的需要。我们就以优酷首页为例,一起学习下ActionBar的综合应用。
二、Android系统ActionBar样式的定义 |
首先,我们先认识一下android系统中是如何定义ActionBar样式的,这里我们以Theme.Holo.Light主题为例,通过源码我们可以看到在该主题中关于ActionBar的样式定义如下:
<style name="Theme.Holo.Light.DarkActionBar">
<item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item>
<item name="actionBarStyle">@style/Widget.Holo.Light.ActionBar.Solid.Inverse</item>
<item name="actionBarWidgetTheme">@style/Theme.Holo</item>
<item name="actionBarTheme">@null</item>
<item name="actionDropDownStyle">@style/Widget.Holo.Spinner.DropDown.ActionBar</item>
<item name="actionButtonStyle">@style/Widget.Holo.ActionButton</item>
<item name="actionOverflowButtonStyle">@style/Widget.Holo.ActionButton.Overflow</item>
<item name="actionModeBackground">@drawable/cab_background_top_holo_dark</item>
<item name="actionModeSplitBackground">@drawable/cab_background_bottom_holo_dark</item>
<item name="actionModeCloseDrawable">@drawable/ic_cab_done_holo_dark</item>
<item name="homeAsUpIndicator">@drawable/ic_ab_back_holo_dark</item>
<item name="actionBarTabStyle">@style/Widget.Holo.Light.ActionBar.TabView.Inverse</item>
<item name="actionBarTabBarStyle">@style/Widget.Holo.Light.ActionBar.TabBar.Inverse</item>
<item name="actionBarTabTextStyle">@style/Widget.Holo.Light.ActionBar.TabText.Inverse</item>
<item name="actionBarDivider">@drawable/list_divider_holo_dark</item>
<item name="actionBarItemBackground">@drawable/item_background_holo_dark</item>
<item name="actionMenuTextColor">?attr/textColorPrimaryInverse</item>
<item name="actionModeStyle">@style/Widget.Holo.Light.ActionMode.Inverse</item>
<item name="actionModeCloseButtonStyle">@style/Widget.Holo.ActionButton.CloseMode</item>
<item name="actionModePopupWindowStyle">@style/Widget.Holo.PopupWindow.ActionMode</item>
<item name="actionModeCutDrawable">@drawable/ic_menu_cut_holo_dark</item>
<item name="actionModeCopyDrawable">@drawable/ic_menu_copy_holo_dark</item>
<item name="actionModePasteDrawable">@drawable/ic_menu_paste_holo_dark</item>
<item name="actionModeSelectAllDrawable">@drawable/ic_menu_selectall_holo_dark</item>
<item name="actionModeShareDrawable">@drawable/ic_menu_share_holo_dark</item>
<item name="actionModeFindDrawable">@drawable/ic_menu_find_holo_dark</item>
<item name="actionModeWebSearchDrawable">@drawable/ic_menu_search_holo_dark</item>
</style>
在如上众多的属性中,需要我们重点关注的样式属性主要有如下几个:
1、actionBarStyle:该属性定义了ActionBar的主要样式,包括ActionBar背景、标题样式、分隔符等等。具体的属性如下:titleTextStyle、background、backgroundSplit、divider。在这里不在贴源码了,大家可自行查看。
2、actionBarSize:定义ActoinBar的高度
3、actionButtonStyle:用于定义Action item button的样式,主要属性有background、paddingStart、paddingEnd、minWidth等。
4、actionBarTabStyle:用于定义ActionBar上的Tabs的样式。
5、actionBarTabBarStyle:用于定义Tab下方细条的样式。
6、actionBarTabTextStyle:用于定义Tab上文字的样式。
三、案例实现 |
下面我们就结合之前的知识和上面的样式一步一步完成本文的案例,优酷首页。
首先,我们将标题隐藏并设置Logo,可通过代码进行设置,如下所示:
ActionBar actionbar= getActionBar();
actionbar.setDisplayUseLogoEnabled(true);
actionbar.setDisplayShowTitleEnabled(false);
actionbar.setDisplayShowHomeEnabled(true);
actionbar.setDisplayHomeAsUpEnabled(false);
actionbar.setLogo(R.drawable.icon_youku);
第二步按照上篇文章的步骤完成Tab导航的添加,在这里就不在贴代码了。
第三步编写menu文件,在这里大家要注意的是overflow区的菜单没法自定义布局,点击overflow溢出的菜单,我是使用了PopupWindow实现的。在PopupWindow中我添加了一个ListView,并为ListView添加了两种Item的布局文件,一个用于登陆菜单,一个用于其他的菜单。菜单文件如下文件具体如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_search"
android:icon="@drawable/btn_game_search"
android:showAsAction="always"
android:title="搜索" />
<item
android:id="@+id/action_game"
android:icon="@drawable/btn_game_icon"
android:orderInCategory="2"
android:showAsAction="always"
android:title="游戏" />
<item
android:id="@+id/action_recommend"
android:icon="@drawable/btn_recommend"
android:orderInCategory="3"
android:showAsAction="always"
android:title="市场" /> <item
android:id="@+id/action_more"
android:icon="@drawable/btn_more_bg"
android:orderInCategory="4"
android:showAsAction="always"
android:title="更多" />
</menu>
菜单文件中,我们让所有的菜单项都显示到ActionBar上。
弹出PopuWindow菜单的方法如下:
public void showPopMenu(){
//获取状态栏高度
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
//计算偏移量,50dp为我们设置的actionbar的高度,默认情况下Tab的高度和ActionBar是一致的
int offsetY=frame.top+getActionBar().getHeight()-dip2px(50);
int offsetX=dip2px(10);
View parentView = LayoutInflater.from(this).inflate(R.layout.activity_main,null);
View popView = LayoutInflater.from(this).inflate(R.layout.pop_layout,null);
ListView myList =(ListView)popView.findViewById(R.id.mylist);
ListAdapter adapter = new ListAdapter(this,initListData());
myList.setAdapter(adapter);
PopupWindow popupWindow = new PopupWindow(popView, dip2px(160), ViewGroup.LayoutParams.WRAP_CONTENT,true);
popupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(),(Bitmap)null));
popupWindow.setOutsideTouchable(true);
//设置弹出动画
popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
popupWindow.showAtLocation(parentView, Gravity.RIGHT|Gravity.TOP,offsetX,offsetY);
}
通过以上步骤,我们即可实现优酷首页的大体模样,但样式还是相差很远,下面我们通过自定义样式来完成。
<style name="AppTheme" parent="android:Theme.Holo.Light">
<!-- Customize your theme here. -->
<item name="android:actionBarSize">50dp</item>
<item name="android:actionBarStyle">@style/CustomActionBarStyle</item>
<item name="android:actionButtonStyle">@style/CustomActionButtonStyle</item>
<item name="android:actionOverflowButtonStyle">@style/CustomActionOverflowStyle</item> <item name="android:actionBarTabStyle">@style/CustomActionTabViewStyle</item>
<item name="android:actionBarTabBarStyle">@style/CustomActionTabBarStyle</item>
<item name="android:actionBarTabTextStyle">@style/CustomActionTabTextStyle</item> <item name="android:itemTextAppearance">@style/CustomItemTextAppearance</item>
</style>
通过actionBarSize设定了ActionBar的高度,通过自定义actionBarStyle定义了ActionBar的背景,具体如下:
<style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
<item name="android:background">@drawable/actionbar_background</item>
</style>
通过actionButtonStyle,定义了左右内边距和最小宽度。
<style name="CustomActionButtonStyle" parent="@android:style/Widget.Holo.ActionButton">
<item name="android:paddingLeft">0dip</item>
<item name="android:paddingRight">0dip</item>
<item name="android:minWidth">30dip</item>
</style>
通过actionBarTabStyle、actionBarTabBarStyle、actionBarTabTextStyle定义Tab相关的样式。
<style name="CustomActionTabBarStyle" parent="@android:style/Widget.Holo.ActionBar.TabBar">
<item name="android:background">@drawable/actionbar_tabview_bg</item>
<item name="android:dividerPadding">10dp</item>
</style> <style name="CustomActionTabTextStyle" parent="@android:style/Widget.Holo.Light.ActionBar.TabText">
<item name="android:textSize">14sp</item>
<item name="android:textStyle">normal</item>
<item name="android:textColor">@color/actionbar_text_color</item>
</style>
想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
android之官方导航栏ActionBar(三)之高仿优酷首页的更多相关文章
- Android之官方导航栏ActionBar
一.ActionBar概述 ActionBar是android3.0以后新增的组件,主要用于标示应用程序以及用户所处的位置并提供相关操作以及全局的导航功能.下面我们就看看如何使用ActionBar,真 ...
- Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法
在上一篇文章(Android之官方导航栏ActionBar)中,我们介绍了ActionBar各组成部分的基本应用.ActionBar除了提供Action Buttons外,还提供了多种导航方式如 Ac ...
- 高仿优酷Android客户端图片左右滑动(自动切换)
本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现: 具体思路: 1. 工程中需要添加android-support-v4.jar,才能 ...
- Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)
通过前几篇文章,我们对Android的导航栏有了一定的了解认识,本次文章将对Toolbar进行综合应用,主要结合DrawerLayout.ViewPager.PagerSlidingTabStrip一 ...
- android MIPI屏 导航栏丢失
/**************************************************************************** * android MIPI屏 导航栏丢失 ...
- Android应用底部导航栏(选项卡)实例
现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其 ...
- Android 修改底部导航栏navigationbar的颜色
Android 修改底部导航栏navigationbar的颜色 getWindow().setNavigationBarColor(Color.BLUE); //写法一 getWindow().set ...
- Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单
原文:Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43131133, ...
- 仿优酷Android客户端图片左右滑动(自动滑动)
最终效果: 页面布局main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...
随机推荐
- HRBUST - 1818 石子合并 区间dp入门
有点理解了进阶指南上说的”阶段,状态和决策“ /* 区间dp的基础题: 以区间长度[2,n]为阶段,枚举该长度的区间,状态dp[l][r]表示合并区间[l,r]的最小费用 状态转移方程dp[l][r] ...
- poj2155二维树状数组区间更新
垃圾poj又交不上题了,也不知道自己写的对不对 /* 给定一个矩阵,初始化为0:两种操作 第一种把一块子矩阵里的值翻转:0->1,1->0 第二种询问某个单元的值 直接累计单元格被覆盖的次 ...
- bootstrap 强调相关的类
.text-muted:提示,使用浅灰色(#999) .text-primary:主要,使用蓝色(#428bca) .text-success:成功,使用浅绿色(#3c763d) .text-info ...
- [转] python安装numpy和pandas
最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了.首要条件,python版本必须 ...
- 071 HBase的安装部署以及简单使用
一:下载安装 1.下载安装 2.开启hadoop与zookeeper 3.修改配置文件hbase-env export JAVA_HOME=/opt/modules/jdk1.7.0_67 expor ...
- 015 在大数据中,关于mapreduce的粗略优化,以及mapreduce的处理过程解释
使用的案例是wordcountmapreduce的程序演示 一: 1.源程序 2.优化的切入点 3.优化的部分代码 二:wordcount的处理过程 1.重点 一个块对应一个map任务. 而做单词统计 ...
- python 一个函数让你决定你的二维码
今天浏览网页时无意中看到了一个特别有趣的二维码,感觉挺有意思的,回来后自己查了一下,发现挺简单的,就分享一下,挺有意思的.该函数的主要流程就是MyQR库中的myqr.run()函数,将连接转化为二维码 ...
- 暴力破解ZIP文件密码
Python 的标准库提供了 ZIP 文件的提取压缩模块 zipfile,现在让我们试着用这个模块,暴力破解出加密的 ZIP 文件!我们可以用 extractall()这个函数抽取文件,密码正确则返回 ...
- Linux服务器下Nginx与Apache共存
解决思路: 将nginx作为代理服务器和web服务器使用,nginx监听80端口,Apache监听除80以外的端口,我这暂时使用8080端口. nginx.conf 位置:/etc/nginx/ngi ...
- BZOJ.3425.[POI2013]Polarization(DP 多重背包 二进制优化)
BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\( ...