开源代码viewpagerindicator里面没有实现tab下划线切换过程中的移动动画,都是很突兀的多个fragement之间的切换,导致用户体验略差,google了下相关问题,发现一片博文:

重点是如下代码:
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);
}
}
});
}
}
UnderlinePageIndicator是viewpagerindicator里面的开源代码:
/**
* Draws a line for each page. The current page line is colored differently
* than the unselected page lines.
*/
为每个page画一条线,使得和其他没选中的page的线条颜色不同。
 
下面主要讲下我在项目中修改的步骤和注意点:
1 修改style文件:
   你使用这个开源库的控件的activity里面必须有如下的style
  1.  android:theme="@style/StyledIndicators",对应styles文件下面:
  1. <!-- 下面带横线tab的style -->
    <style name="StyledIndicators" parent="@android:style/Theme.Light">
    <item name="vpiTabPageIndicatorStyle">@style/CustomTabPageIndicator</item>
    </style>
    <style name="CustomTabPageIndicator" parent="Widget.TabPageIndicator">
    <!-- <item name="android:background">@drawable/tab_indicator</item> -->
    <item name="android:background">#00000000</item>
    <item name="android:textAppearance">@style/CustomTabPageIndicator.Text</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textColor">@drawable/viewpager_title_textcolor</item>
    <item name="android:dividerPadding">8dp</item>
    <item name="android:showDividers">middle</item>
    <item name="android:paddingLeft">10dp</item>
    <item name="android:paddingRight">10dp</item>
    <item name="android:fadingEdge">horizontal</item>
    <item name="android:fadingEdgeLength">8dp</item>
    </style>


原来的background主要定义了tab的切换时候,下滑
  1. <item name="android:background">@drawable/tab_indicator</item>

    对应的drawable中切换的xml代码:

  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" />
    <item android:state_selected="false" android:state_pressed="true" android:drawable="@android:color/transparent" />
    <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/base_tabpager_indicator_selected" />
    <item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/base_tabpager_indicator_selected" />
    </selector>
其中base_tabpager_indicator_selected是带有下划线的.9图片
 
 
现在将style文件里面的background修改为:
<itemname="android:background">#00000000</item>
然后主要是修改布局,主要是添加UnderlinePageIndicatorEx布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.soyoungboy.view.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_width="fill_parent"
android:layout_height="45dp"
android:background="@color/white" />
<com.soyoungboy.view.viewpagerindicator.UnderlinePageIndicatorEx
android:id="@+id/underline_indicator"
android:layout_width="fill_parent"
android:layout_height="3dp"
/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
然后就是代码里边的修改:
  1. //1,声明组件
    private UnderlinePageIndicatorEx mUnderlinePageIndicator;
    //2,代码实现部分
    mUnderlinePageIndicator = (UnderlinePageIndicatorEx) findViewById(R.id.underline_indicator);
    mUnderlinePageIndicator.setViewPager(viewpager);
    mUnderlinePageIndicator.setFades(false);
    indicator.setOnPageChangeListener(mUnderlinePageIndicator);
如此,ok,完美解决,tab下划线可实现滑动时候随之切换的效果

【界面优化】使用viewpagerindicator添加下划线滑动动画的更多相关文章

  1. iOS开发-UILabel和UIButton添加下划线

    关于UILabel和UIButton有的时候需要添加下划线,一般有两种方式通过默认的NSMutableAttributedString设置,第二种就是在drawRect中画一条下划线,本文就简单的选择 ...

  2. vim显示行号、语法高亮、自动缩进、添加下划线的设置

    ubuntu默认是没有安装vim的,所以设置以前请先安装vim:sudo apt-get install vim. 然后 打开vim的配置文件:sudo vim /etc/vim/vimrc 或者 s ...

  3. Android 给EditText添加下划线

    在安卓高版本,默认是有下划线的,其默认下划线的颜色是由其主题颜色来控制的! 控制如下: <style name="AppTheme" parent="Theme.A ...

  4. IOS UIlabel 、UIButton添加下划线

    1.给UILabel 添加下划线 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )]; label.backgrou ...

  5. UILabel和UIButton添加下划线

    关于UILabel和UIButton有的时候需要添加下划线,一般有两种方式通过默认的 NSMutableAttributedString设置,第二种就是在drawRect中画一条下划线,本文就简单的选 ...

  6. "为文本添加下划线"组件:<u> —— 快应用组件库H-UI

     <import name="u" src="../Common/ui/h-ui/text/c_tag_underline"></impor ...

  7. TextView 为部分文字添加下划线,并实现单击事件

    在开发应用的过程中经常会遇到显示一些不同的字体风格的信息,如关键词高亮显示的等.对于类似的情况,一般我们会想着使用多个TextView去实现,对于每个TextView设置不同的字体风格来满足需求.   ...

  8. [UGUI]图文混排(五):添加下划线

    0.下划线标签 标签格式:<material=underline c=#ffffff h=1 n=*** p=***>blablabla...</material> mater ...

  9. SpringData JPA 在解析实体类字段时驼峰自动添加下划线问题

    参考地址:https://my.oschina.net/javamaster/blog/2246886 SpringData JPA 使用的默认命名策略是: ImprovedNamingStrateg ...

随机推荐

  1. 【原】tinker dex文件格式的dump工具tinker-dex-dump

    序言 Tinker是微信推出的热更新开源项目,同其它热更新方案相比具有补丁包小,支持类,so,资源文件的替换等优点.其中在类替换的方案里自主研发了DexDiff算法,使得补丁包变的更小.DexDiff ...

  2. 【转】微信小程序专项测试

    微信小程序专项测试 by 云层 原文地址: http://mp.weixin.qq.com/s?__biz=MzA4NDIzNTIzNA==&mid=2654370226&idx=1& ...

  3. InnoDB的约束机制

    数据完整性 关系型数据库系统和文件系统的一个不同点是,关系数据库本身能保证存储数据的完整性,不需要应用程序的控制,而文件系统一般需要在程序端进行控制.几乎所有的关系型数据库都提供了约束(constra ...

  4. codewars-random(4)

    问题简介:算多长时间用本金能得到想要的利息,基础题. 代码:function calculateYears(principal, interest, tax, desired) {    // you ...

  5. 解读<!doctype html>

    回归简单的doctype声明:http://blog.csdn.net/wangxiaoqin11/article/details/42032037 为何说 HTML5「no longer based ...

  6. Java线程如何返回数据

    前言 当开发者从单线程开发模式过渡到多线程环境,一个比较棘手的问题就是如何在一个线程中返回数据,众所周知,run()方法和start()方法不会返回任何值. 笔者在学习<Java Network ...

  7. gridview动态添加行(不用datatable实现)

    GridViewRow newrow = , , DataControlRowType.Separator, DataControlRowState.Normal); TableCell[] tc=] ...

  8. httpclient用法

    Http通信方式:HttpURLConnection和HttpClient HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便HttpClient就是一个增强版的 ...

  9. JS 高效快速的数组去重

    Array.prototype.uniquer = function() { var result = [], hash = {}; ; i < this.length; i++) { if ( ...

  10. 64位Java开发平台的选择,如何区分JDK,Tomcat,eclipse的32位与64版本

    当你想下载Linux.JDK.Tomcat.eclipse时,你是下载32位版本还是64位版本?64位版本有两种,应该选哪一个? 当你看到这些内容:x86.x64.x86-32.x86-64.ia64 ...