接上篇博文: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的更多相关文章

  1. GitHub上不错的Android开源项目(三)

    收集相关系列资料,自己用作参考,练习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) GitHub上不错的Android开源项目(一):http://ww ...

  2. GitHub上最火的74个Android开源项目(三)

    此前,推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“GitHub上最火的40个Android开源项目(一).(二)中,我们也相继盘点了40个GitHub上最受欢迎的A ...

  3. GitHub 优秀Android 开源项目

    阅读目录 1.Xabber客户端 2.oschina客户端 3.手机安全管家 4.星座连萌 5.玲闹铃 6.魔乐盒 7.PWP日历 8.Apollo音乐播放器 9.夏普名片识别 10.高仿人人网 11 ...

  4. 100个Github上Android开源库

    项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...

  5. Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC),Guice非常小而且快.Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数 ...

  6. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  7. GitHub上史上最全的Android开源项目分类汇总

    今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...

  8. GitHub 优秀的 Android 开源项目 (精品)

    1原文地址为 http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea Android开源项目系列汇总已完成,包 ...

  9. Android 开源项目及其学习

    Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...

随机推荐

  1. linux初级学习笔记六:linux用户及权限详解!(视频序号:03_4)

    本节学习的命令:/etc/passwd,/etc/shadow,/etc/group文件详解 本节学习的技能: 安全上下文 文件与目录的权限管理 影子命令 用户,用户组类别详解 /etc/passwd ...

  2. ad广告下拉收起代码

    1. [代码][JavaScript]代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  3. 设置linux服务器下开放端口

    查询 netstat -anp  所有开放端口信息 二.关闭端口号: iptables -A OUTPUT -p tcp --dport 端口号-j DROP 三.打开端口号: iptables -A ...

  4. codeforces 669D D. Little Artem and Dance(乱搞题)

    题目链接: D. Little Artem and Dance time limit per test 2 seconds memory limit per test 256 megabytes in ...

  5. bzoj2660最多的方案——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 首先,多种方案的出现是因为一个较大的斐波那契数可以变成两个较小的: 用一个01串来表示 ...

  6. UI:地图和定位

    参考学习链接 各种IOS设备可以使用 Core Location 框架确定它的物理位置.core location 主要使用三种技术来实现功能.GPS.蜂窝基站三角网络定位. wifi 定位服务.这三 ...

  7. Java中手动提交事务

    项目中遇到一个问题,就是在程序的执行过程中需要不断地更新某个信息,但是在springmvc中好像是默认不可以的,那么就需要手动提交 // 从spring容器对象中获取DataSourceTransac ...

  8. LXC安装

    #安装lxcsudo apt-get install lxc#创建一个容器,会出现下图选择的界面 lxc-create -t download -n my-container #开启lxc-start ...

  9. iOS中音频的录制与播放(本地音频文件的播放)

    iOS功能开发涉及到音频处理时,最常见的时进行录音,以及音频文件的播放.停止播放等的操作.在开发中还要避免同一个音频文件,或不同音频文件之间的处理,比如说正在播放A音频时,可以停止播放A音频,也可以播 ...

  10. python 之 配置环境变量、通过pip 安装第三方库

    配置环境变量 右击桌面上的“此电脑”—>“属性”—>“高级系统设置”—>右下角“环境变量”—>双击“系统变量”里的“Path”—>点击“新建”—>输入python的 ...