Github-Client(ANDROID)开源之旅(三) ------ 巧用ViewPagerIndicator
接上篇博文:Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock
文中结合了网易新闻客户端讲解了开源库ActionBarSherklock的使用
今天蓝老师再给大家讲解一个开源库的使用,它就是ViewPagerIndicator(同样出自JakeWharton之手,ps:这胖子还是蛮厉害的)
官网地址:http://viewpagerindicator.com/
Github地址:https://github.com/JakeWharton/Android-ViewPagerIndicator
ViewPagerIndicator作为一款分页指标小部件兼容ViewPager,封装上做得还是不错的,目前为众多知名应用所使用
具体API使用大家下载官方demo示例瞅瞅就欧了(链接库都不懂得怎么引用的童鞋自个儿先去补补课)
以下是官网的效果图
本文就以优化大师的TAB滑动标签页为例来讲解该库的扩展使用
先上效果图,原版
山寨版
玩过优化大师的童鞋应该注意到,tab底部的下划线是会随着pager的滑动而实时变化,而网上很多demo则是标签页切换时下划线的动画效果,二者是有区别的,当然只要在onPageScrolled添加一些处理同样可以达到效果,不过代码就多了很多额外处理,另外这么做也不够通用,本着不重复发明轮子的原则,我们只需对现有控件做一些改造就可以实现我们想要的效果了
先看layout文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#dddddd"> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:background="#074060"> <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="安卓优化大师"
android:textColor="#eeeeee"
android:textSize="20sp"/> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/titlebar_logo"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/title"
android:layout_marginRight="10dp"/> </RelativeLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="35dp"
android:orientation="vertical"
android:background="@drawable/main_header_background"> <com.viewpagerindicator.TabPageIndicator
android:id="@+id/tab_indicator"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/> <com.lance.tablinepagerindictor.widget.UnderlinePageIndicatorEx
android:id="@+id/underline_indicator"
android:layout_height="3dp"
android:layout_width="fill_parent"
android:layout_alignParentBottom="true"/> </LinearLayout> <android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/> </LinearLayout>
再看UnderlinePageIndicatorEx的实现
public class UnderlinePageIndicatorEx extends UnderlinePageIndicator{ public UnderlinePageIndicatorEx(Context context) {
super(context, null); } public UnderlinePageIndicatorEx(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.vpiUnderlinePageIndicatorStyle); } public UnderlinePageIndicatorEx(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); } @Override
public void setViewPager(ViewPager viewPager) {
if (mViewPager == viewPager) {
return;
}
// if (mViewPager != null) {
// //Clear us from the old pager.
// mViewPager.setOnPageChangeListener(null);
// }
if (viewPager.getAdapter() == null) {
throw new IllegalStateException("ViewPager does not have adapter instance.");
}
mViewPager = viewPager;
// mViewPager.setOnPageChangeListener(this);
invalidate();
post(new Runnable() {
@Override public void run() {
if (mFades) {
post(mFadeRunnable);
}
}
});
}
}
UnderlinePageIndicatorEx继承了UnderlinePageIndicator,前面提到链接库有所改动
事实上就是把成员变量的访问权限由private改为protected,然后重写了setViewPager方法(why?自个儿琢磨去)
最后看看activity中如何调用
public class MainActivity extends FragmentActivity { private ContentFrameAdapter mContentAdapter;
private ViewPager mPager;
private TabPageIndicator mTabPageIndicator;
private UnderlinePageIndicatorEx mUnderlinePageIndicator; private int COUNT = 0;
private List<TitleStruct> mTitleList;
private List<ContentStruct> mContentList; @Override
protected void onCreate(Bundle arg0) { super.onCreate(arg0);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main); initData();
setupViews(); } private void setupViews(){ mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mContentAdapter); mTabPageIndicator = (TabPageIndicator) findViewById(R.id.tab_indicator);
mTabPageIndicator.setViewPager(mPager); mUnderlinePageIndicator = (UnderlinePageIndicatorEx)findViewById(R.id.underline_indicator);
mUnderlinePageIndicator.setViewPager(mPager);
mUnderlinePageIndicator.setFades(false); mTabPageIndicator.setOnPageChangeListener(mUnderlinePageIndicator);
} private void initData(){
mContentList = new ArrayList<ContentStruct>();
mTitleList = new ArrayList<TitleStruct>(); String[] arrStrings = getResources().getStringArray(R.array.sections);
COUNT = arrStrings.length;
for (int i = 0; i < COUNT; i++) {
ContentStruct object = new ContentStruct();
object.daString = arrStrings[i];
object.index = i;
mContentList.add(object); TitleStruct object2 = new TitleStruct(arrStrings[i]);
mTitleList.add(object2);
} mContentAdapter = new ContentFrameAdapter(getSupportFragmentManager());
mContentAdapter.setContentList(mContentList);
mContentAdapter.setTitleList(mTitleList); } }
简洁明了,是不是比在activity添加一堆乱七八糟的东西要好看的多?
其它的就没啥好咋乎的了,最后附上工程链接:
http://download.csdn.net/detail/geniuseoe2012/5641165
欲知后事如何,且听下回分解
more brilliant,Please pay attention to my CSDN blog -->http://blog.csdn.net/geniuseoe2012
开源之旅(四) Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice
Github-Client(ANDROID)开源之旅(三) ------ 巧用ViewPagerIndicator的更多相关文章
- GitHub上不错的Android开源项目(三)
收集相关系列资料,自己用作参考,练习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) GitHub上不错的Android开源项目(一):http://ww ...
- GitHub上最火的74个Android开源项目(三)
此前,推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“GitHub上最火的40个Android开源项目(一).(二)中,我们也相继盘点了40个GitHub上最受欢迎的A ...
- GitHub 优秀Android 开源项目
阅读目录 1.Xabber客户端 2.oschina客户端 3.手机安全管家 4.星座连萌 5.玲闹铃 6.魔乐盒 7.PWP日历 8.Apollo音乐播放器 9.夏普名片识别 10.高仿人人网 11 ...
- 100个Github上Android开源库
项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...
- Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC),Guice非常小而且快.Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数 ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- GitHub上史上最全的Android开源项目分类汇总
今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...
- GitHub 优秀的 Android 开源项目 (精品)
1原文地址为 http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea Android开源项目系列汇总已完成,包 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
随机推荐
- xunit输出output到控制台
1.https://xunit.github.io/docs/capturing-output 里面似乎提到2个方法,第二个方法还需要在配置文件中添加appSetting 这里采用第一种方法, 1.添 ...
- 使用Windows Debugger调试托管代码----引用自官方帮助文档
以下文字引用在Windbg的帮助文档.觉得对初次调试托管代码,非常有用,故粘贴至此. ========================================================= ...
- LA-4356&&hdu-2469 (极角排序+扫描线)
题目链接: Fire-Control System Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Linux Bash 提示符的一些骚年操作
当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符: 百牛信息技术bainiu.ltd整理发布于博客园[user@$host ~]$1[use ...
- DDK编写64位驱动时加入x64汇编的方法
上篇讲了如何在编写x64应用程序时加入x64汇编,这里来说说如何在编写x64驱动时加入x64汇编. 一.在asm文件中单独编写功能函数 比如要实现一个64位的加法函数,原型如下: ULONG64 my ...
- 树莓派Dietpi系统配置Dueros
dietpi 系统安装alsa工具 安装依赖 sudo apt-get install python-dateutil sudo apt-get install gir1.2-gstreamer- ...
- 3.1-3.5 分布式部署hadoop2.x的准备和配置
一.环境 192.168.1.130 master 192.168.1.131 slave1 192.168.1.132 slave2 所有主机: 1.关闭防火墙.selinu ...
- 看鸟哥的Linux私房菜的一些命令自我总结(一)
-显示目前所支持的语言 echo &LANG -修改语言成为英文系统 LANG=en_US -显示日历的命令 cal [[month] year] -惯用关机命令 shutdown 参数: ...
- lua-resty-r3 高性能 OpenResty 路由实现
大家下午好!首先做下自我介绍,我于 2014 年加入奇虎 360,后与温铭结识,当时他正在基于 OpenResty 做天擎服务端,用于提供 API 服务.2015 年我们一起写了< OpenRe ...
- EOJ3247:铁路修复计划
传送门 题意 分析 这题用二分做就好啦,有点卡常数,改了几下for的次数 套了个板子,连最小生成树都忘记了QAQ trick 代码 #include<cstdio> #include< ...