基于ViewPagerIndicator的UnderlinePageIndicator,ViewPager选项卡底部滑块衬线滑动控件

《基于ViewPagerIndicator的UnderlinePageIndicator,ViewPager选项卡底部滑块衬线滑动控件》

基于github上的第三方开源的ViewPagerIndicator的UnderlinePageIndicator( 附:地址),自己写的一个在选项卡底部有衬线的滑动控件。

控件效果图如图所示。

有一个特别的效果是:头部的选项卡在ViewPager切换过程中,底部的滑块也随之动态渐渐滑动过渡。

代码:

MainActivity.java

package zhangphil.underline;

import java.util.ArrayList;

import com.viewpagerindicator.UnderlinePageIndicator;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
import android.graphics.Color;
import android.os.Bundle;

/**
 * 基于第三方开源的ViewPagerIndicator的UnderlinePageIndicator,自己写的一个在选项卡底部有衬线的滑动控件。
 * 控件效果图如图所示。
 * 这里面有一个特别的效果是:头部的选项卡在ViewPager切换过程中,底部的滑块也随之动态渐渐滑动过渡。
 *
 * */

public class MainActivity extends ActionBarActivity {

	private LinearLayout mLinearLayout;
	private ArrayList<Fragment> mArryList;
	private ViewPager mPager;

	// 未被选中的选项卡字体颜色
	private int COLOR_NORMAL = Color.DKGRAY;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mArryList = new ArrayList<Fragment>();
		// 初始化5个Fragment作为测试。
		for (int i = 0; i < 5; i++) {
			TestFragment f = (TestFragment) TestFragment.newInstance();
			f.id = i;
			mArryList.add(f);
		}

		PagerAdapter mAdapter = new MyFragmentAdapter(
				getSupportFragmentManager());

		mPager = (ViewPager) findViewById(R.id.pager);
		mPager.setAdapter(mAdapter);

		UnderlinePageIndicator mIndicator = (UnderlinePageIndicator) findViewById(R.id.indicator);
		mIndicator.setViewPager(mPager);
		mIndicator.setFades(false);
		mIndicator.setSelectedColor(0xff33B5E5);
		mIndicator
				.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

					@Override
					public void onPageSelected(int pos) {
						setIndicatorViewSelected(pos);
					}

					@Override
					public void onPageScrolled(int arg0, float arg1, int arg2) {

					}

					@Override
					public void onPageScrollStateChanged(int arg0) {

					}
				});

		mLinearLayout = (LinearLayout) findViewById(R.id.tab_LinearLayout);
		// 添加选项卡
		addIndicators();

		// 初始化,第0项被选中
		setIndicatorViewSelected(0);
	}

	// 添加Tab选项卡
	private void addIndicators() {
		for (int i = 0; i < getItemsCount(); i++) {
			View v = getIndicatorAt(i);
			addIndicatorItem(v, i);
		}
	}

	// 在这里设置被选中时候选项卡变化的效果
	private void setIndicatorViewSelected(int pos) {
		for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
			if (i == pos) {
				View v = mLinearLayout.getChildAt(i);
				TextView tv = (TextView) v;
				// Android Holo 样式的蓝色
				tv.setTextColor(0xff33B5E5);
			} else {
				View v = mLinearLayout.getChildAt(i);
				TextView tv = (TextView) v;
				tv.setTextColor(COLOR_NORMAL);
			}
		}
	}

	protected int getItemsCount() {
		return mArryList.size();
	}

	// 在这里仅仅返回一个TextView作为选项卡的View。
	// 此处可以返回更丰富的View。
	protected View getIndicatorAt(int pos) {
		TextView v = new TextView(this);
		v.setGravity(Gravity.CENTER);
		v.setText("选项卡" + pos);
		v.setTextColor(COLOR_NORMAL);
		return v;
	}

	// 在线性布局里面依次添加一个View,为添加的View添加事件。
	private void addIndicatorItem(View view, final int index) {
		LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.MATCH_PARENT, 1);
		mLinearLayout.addView(view, index, params);
		view.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 当用户点击该View时候,设置ViewPager正确而Pager Item
				set(index);
			}
		});
	}

	private void set(int pos) {
		mPager.setCurrentItem(pos, true);
		setIndicatorViewSelected(pos);
	}

	// 仅仅用于测试的Fragment,用一个id标识。
	private static class TestFragment extends Fragment {

		public int id;

		public static Fragment newInstance() {
			return new TestFragment();
		}

		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {

			TextView v = new TextView(getActivity());
			v.setGravity(Gravity.CENTER);
			v.setTextSize(50f);
			v.setText("Fragment: " + id);

			return v;
		}
	}

	private class MyFragmentAdapter extends FragmentPagerAdapter {

		public MyFragmentAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public Fragment getItem(int position) {
			return mArryList.get(position);
		}

		@Override
		public int getCount() {
			return mArryList.size();
		}
	}
}

需要的布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/tab_LinearLayout"
        android:layout_width="match_parent"
        android:layout_height="30dip"
        android:orientation="horizontal" />

    <com.viewpagerindicator.UnderlinePageIndicator
        android:id="@+id/indicator"
        android:layout_width="match_parent"
        android:layout_height="7px" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="#33B5E5" />

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>



时间: 2024-08-07 01:21:58

基于ViewPagerIndicator的UnderlinePageIndicator,ViewPager选项卡底部滑块衬线滑动控件的相关文章

Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡

 <Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡> 之前基于github上的第三方开源控件ViewPagerIndicator的UnderlinePageIndicator(原文链接:http://blog.csdn.net/zhangphil/article/details/44752213),自己写了一个底部带有滑块.且当ViewPager页面切换时候选项卡也随之相应切换,且滑块也随之相应动态滑动效果得控件.但写的太过于紧耦合,不利于复用,所以现在重构

Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法

最近项目有一个需求,需要多层可滑动控件的嵌套展示,demo效果如下,demo的下载地址在最后 咋一看好像挺简单啊,不就是一个ScrollView + ViewPager + ListView吗,我开始也这样觉得,也用的这种方式实现,结果始终和效果不对劲.这里总结几点问题: 两个或两个以上的滑动控件嵌套时,如果layout_height采用的是wrap_content会造成内部滑动控件的高度不能正确的计算,会导致内部滑动控件的高度始终为0,除非你用定值设置,比如300dp. 两个相同滑动方向的滑动

iOS系列 基础篇 09 开关、滑块和分段控件

iOS系列 基础篇 09 开关.滑块和分段控件 目录: 案例说明 开关控件Switch 滑块控件Slider 分段控件Segmented Control 1. 案例说明 开关控件(Switch).滑块控件(Slider)和分段控件(Segmented Control)都是UIControl的子类,本篇我们将通过一个案例和大家一起学习这三个控件的使用. 如下图所示,本案例包括两个开关控件Switch.一个分段控件(Segmented Control).两个标签(Label)和一个滑块控件(Slid

Android自定义LinearLayout实现左右侧滑菜单,完美兼容ListView、ScrollView、ViewPager等滑动控件

国际惯例,先来效果图 在阅读本文章之前,请确定熟悉[Scroller]相关的知识,如果不熟悉,请小伙伴儿先百度后再来吧. 假如你已经知道[Scroller]了,那么就接着往下看吧. 首先,我们把侧拉菜单的构造给解析出来.多次观看上面的效果图,我们可以得出以下的结论. 整体可以看做是一个ViewGroup,这个ViewGroup包含了最多三个子View(分别是左菜单的红色View.中间正文内容的白色View.右菜单的蓝色View): 三个子View(我称为UI界面,因为代码中的Java类就取名这个

转--基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

原文  http://www.cnblogs.com/wuhuacong/p/3317223.html 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用 在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控件有:单行文本框.多行文本框.密码文本框.下拉列表Combobox.日期输入控件.数值输入控件.单项选择.复选框.表格控件Da

基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控件有:单行文本框.多行文本框.密码文本框.下拉列表Combobox.日期输入控件.数值输入控件.单项选择.复选框.表格控件DataGrid.树形控件.布局控件.弹出式对话框.提示信息.列表控件等,这些界面控件的操作都有哪些不同,下面我们来逐一进行介绍. <input class="easyui

ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法

一.上图 二.场景描述 近期在做项目的时候,遇到一个怪异的需求,描述如下: 1.ViewPager中嵌套3个View,当从View1滑动到View2时禁止ViewPager的滑动事件. 2.通过View2底部改变页面的布局实现滑动到View1和View3. 3.View2内嵌的View中还存在一个可以左右滑动的View,在其上添加了手势,即支持左右滑动,这里存在事件冲突,需要通过事件分发来进行处理. 三.问题解决思路 1.禁止ViewPager滑动,主要是不让ViewPager执行scrollT

自定义ViewPager,避免左右滑动时与水平滑动控件冲突

import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View; public class CanScrollViewPager extends ViewPager { private boolean mNoScroll = false;/

基于Extjs的web表单设计器 第三节——控件拖放

看过之前设计器截图的朋友应该有印象,可能会发觉我们的设计器UI设计布局其实类似Visual studio 的设计界面,采用的是左.中.右三个区域布局.左侧为控件区域.中间为表单的画布设区域.右侧为属性区域.这样的UI设计肯定就得支持控件的拖拽设计,用户只要拖放一个控件到我们的画布上,那么画布就应该立即能够看到我们拖放的控件在画布中的位置.大小.以及一些控件自带的默认信息.不用说这样的设计对于用户来说不论在操作体验上还是设计的感官上都更加直接和方便,因为我在设计阶段就可以知道我设计后的表单在系统运