`

为ViewPager设置SimpleViewPagerIndicator

阅读更多
说到ViewPagerIndicator,网上有很多专门的开源库;
我这里重提一下,只是想试试它的实现方法;
记录下来,可以以后快速的修改迭代~~~

很简单的一个类:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SimpleViewPagerIndicator extends LinearLayout
{

    private static final int COLOR_TEXT_NORMAL = 0xFF999999;

    private static final int COLOR_INDICATOR = Color.BLACK;

    private String[] mTitles;

    private int mTabCount;

    private int mIndicatorColor = COLOR_INDICATOR;

    private float mTranslationX;

    private Paint mPaint = new Paint();

    private int mTabWidth;

    private int oldPosition = 0;

    private ViewPager viewPager;

    public SimpleViewPagerIndicator(Context context)
    {
        this(context, null);
    }

    public SimpleViewPagerIndicator(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        mPaint.setColor(mIndicatorColor);
        mPaint.setStrokeWidth(10.0F);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
        mTabWidth = w / mTabCount;
    }

    public void setTitles(String[] titles)
    {
        mTitles = titles;
        mTabCount = titles.length;
    }

    public void setIndicatorColor(int indicatorColor)
    {
        this.mIndicatorColor = indicatorColor;
    }

    @Override
    protected void dispatchDraw(Canvas canvas)
    {
        super.dispatchDraw(canvas);
        canvas.save();
        canvas.translate(mTranslationX, getHeight() - 2);
        canvas.drawLine(0, 0, mTabWidth, 0, mPaint);
        canvas.restore();
    }

    public void setViewPager(ViewPager viewPager)
    {

        if (viewPager instanceof ViewPager)
        {
            this.viewPager = viewPager;
            viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
            {
                @Override
                public void onPageSelected(int position)
                {
                    View v = getChildAt(position);
                    if (v instanceof TextView)
                    {
                    	TextView oldTv = (TextView) getChildAt(oldPosition);
                    	oldTv.setTextColor(COLOR_TEXT_NORMAL);
                    	
                        TextView tv = (TextView) v;
                        tv.setTextColor(COLOR_INDICATOR);

                        oldPosition = position;
                    }
                    if (onPageChangeListener != null)
                    {
                        onPageChangeListener.onPageSelected(position);
                    }
                }

                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
                {
                    scroll(position, positionOffset);
                }

                @Override
                public void onPageScrollStateChanged(int state)
                {

                }
            });
        }

    }

    public void scroll(int position, float offset)
    {
        mTranslationX = getWidth() / mTabCount * (position + offset);
        invalidate();
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        return super.dispatchTouchEvent(ev);
    }

    private void generateIndicators()
    {
        if (getChildCount() > 0)
            this.removeAllViews();
        int count = mTitles.length;

        setWeightSum(count);
        for (int i = 0; i < count; i++)
        {
            TextView tv = new TextView(getContext());
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT);
            lp.weight = 1;
            tv.setTag(i);
            tv.setGravity(Gravity.CENTER);
            tv.setTextColor(COLOR_TEXT_NORMAL);
            tv.setText(mTitles[i]);
            tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
            tv.setLayoutParams(lp);
            tv.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    int position = (Integer) v.getTag();
                    if (viewPager != null)
                    {
                        viewPager.setCurrentItem(position);
                    }
                    if(onItemClickListener!=null){
                    	onItemClickListener.onItemClick(v, position);
                    }
                }
            });
            addView(tv);
        }
    }

    private OnPageChangeListener onPageChangeListener;

    public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener)
    {
        this.onPageChangeListener = onPageChangeListener;
    }

    public interface OnPageChangeListener
    {
        public void onPageSelected(int position);
    }

    
    private OnItemClickListener onItemClickListener;
    
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
		this.onItemClickListener = onItemClickListener;
	}

	public interface OnItemClickListener
    {
        public void onItemClick(View view,int position);
    }
    /**
     * 选中当前页 。此方法一定要在setTitles(),setViewPager()之后调用!
     * 
     * @param position
     */
    public void setCurrentItem(int position)
    {
        oldPosition = position;
        generateIndicators();
        if (viewPager != null)
        {
            viewPager.setCurrentItem(position);
        }
    }

    
}



用法:
package com.example.testviewpagerindicator;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;

import com.me.view.SimpleViewPagerIndicator;

public class MainActivity extends FragmentActivity
{
    private Context context;

    private String[] titles = new String[]
    { "第1页", "第2页", "第3页", "第4页" };

    private SimpleViewPagerIndicator indicator;

    private ViewPager viewpager;

    private FragmentPagerAdapter pagerAdapter;

    private TabFragment[] fragments = new TabFragment[titles.length];

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        initViews();
    }

    private void initViews()
    {
        for (int i = 0; i < titles.length; i++)
        {
            fragments[i] = (TabFragment) TabFragment.newInstance(titles[i]);
        }

        pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
        {
            @Override
            public int getCount()
            {
                return titles.length;
            }

            @Override
            public Fragment getItem(int position)
            {
                return fragments[position];
            }

        };

        viewpager = (ViewPager) findViewById(R.id.viewpager);
viewpager.setAdapter(pagerAdapter);

        indicator = (SimpleViewPagerIndicator) findViewById(R.id.indicator);
        indicator.setTitles(titles);
        indicator.setViewPager(viewpager);
        indicator.setCurrentItem(1);

        // indicator.setOnPageChangeListener(new SimpleViewPagerIndicator.OnPageChangeListener()
        // {
        //
        // @Override
        // public void onPageSelected(int position)
        // {
        // // TODO Auto-generated method stub
        // Toast.makeText(context, position + " clicked", Toast.LENGTH_SHORT).show();
        // }
        // });

    }

}


注意:使用了SimpleViewPagerIndicator之后,需要使用indicator.setOnPageChangeListener(...)监听页面的切换,不要再使用viewpager .setOnPageChangeListener(...)设置了。

最后是个Fragment:
package com.example.testviewpagerindicator;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class TabFragment extends Fragment
{
	public static final String TITLE = "title";
	private String mTitle = "Defaut Value";
	private TextView mTextView;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		if (getArguments() != null)
		{
			mTitle = getArguments().getString(TITLE);
		}
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState)
	{
		View view = inflater.inflate(R.layout.fragment_tab, container, false);
		mTextView = (TextView) view.findViewById(R.id.id_info);
		mTextView.setText(mTitle);
		return view;

	}

	public static TabFragment newInstance(String title)
	{
		TabFragment tabFragment = new TabFragment();
		Bundle bundle = new Bundle();
		bundle.putString(TITLE, title);
		tabFragment.setArguments(bundle);
		return tabFragment;
	}

}


主布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.example.testviewpagerindicator"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <com.me.view.SimpleViewPagerIndicator
        android:id="@+id/indicator"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="#ffffffff" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:flipInterval="30"
        android:persistentDrawingCache="animation"
         />
    
</LinearLayout>



https://github.com/ogaclejapan/SmartTabLayout


http://www.open-open.com/lib/view/open1426474795101.html

一个带有回弹效果的ViewPager,这个类具体见:
http://gundumw100.iteye.com/blog/1775588


Android 高仿微信6.0主界面 带你玩转切换图标变色
http://blog.csdn.net/lmj623565791/article/details/41087219
Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器
http://blog.csdn.net/lmj623565791/article/details/44098729
Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI
http://blog.csdn.net/lmj623565791/article/details/42160391
Android TabLayout 库:FlycoTabLayout
http://www.open-open.com/lib/view/open1447294190257.html
分享到:
评论

相关推荐

    动态设置View的宽高(设置ViewPager的高度)

    动态设置View的宽高(设置ViewPager的高度) 利用ViewPager显示banner的时候,一些人会直接写死ViewPager高度,比如在xml布局里面直接写成180dp。 本例在代码中动态设置ViewPager的高度,让他的高度始终和高度呈...

    自定义无缓存的viewPager

    Viewpager setOffscreenPageLimit(0) 无效 至少会缓存一页 使用此viewpage 代替原生 的 之后设置setOffscreenPageLimit(0) 可不缓存

    Android控件ViewPager实现带有动画的引导页

    3. 在 Activity 中实例化 ViewPager 并将 Adapter 设置给它 知识点二:PagerAdapter 的实现 PagerAdapter 是 ViewPager 的核心组件,负责提供要展示的内容。它有四个主要方法: 1. instantiateItem():创建一个新...

    ViewPager 动态设置滑动限制

    (由于第一次上传的资源文件,代码被加密了,因此重新上传一份未加密的)整个实现用的是TabPageIndicator + ViewPager ,现在的要求是上面的TabPageIndicator 和 下面的 ...要保持能滑动)以及ViewPager是否可以滑动。

    Viewpager加载网络图片轮播

    5. **轮播图实现**:为了实现自动轮播,通常需要在Activity或Fragment的生命周期中设置一个定时器(Timer或Handler的postDelayed),每隔一定时间切换到下一个页面。同时,需要处理好轮播的边界情况,比如当达到最后...

    ViewPager 滑动速度设置,并实现点击按钮滑动!

    在这个例子中,`MIN_VELOCITY`和`MAX_VELOCITY`是你定义的最小和最大滑动速度值,可以根据需求进行设置。 接下来,我们讨论如何通过按钮实现页面的滑动。在Android中,我们可以使用`ViewPager`的`setCurrentItem()`...

    Android根据图片高度动态设置ViewPager高度

    此外,也可以通过设置`ViewPager`的offscreenPageLimit属性来控制预加载页面的数量,减少不必要的加载和高度计算。 通过以上步骤,我们可以实现根据网络图片高度动态设置`ViewPager`高度的功能。这不仅可以提高用户...

    ViewPager页面布局

    ViewPager是Android平台上一个强大...通过掌握ViewPager的基本使用和自定义适配器,你可以轻松地为应用添加丰富的交互效果。实践是检验真理的唯一标准,尝试在你的项目中运用这些知识,你将对ViewPager有更深入的理解。

    android viewpager各种滑动动画

    2. **OffscreenPageLimit**:这是设置预加载页面数量的属性,决定ViewPager会提前加载多少个相邻页面。默认值为1,但可以根据需求调整以优化用户体验。 3. **PageTransformer**:这是实现自定义滑动动画的关键。...

    android ViewPager指示器

    IndicatorBar是一个轻量级的Android库,专门为ViewPager设计,提供了一种简单的方式来创建自定义的指示器。在使用IndicatorBar之前,确保已经在项目的build.gradle文件中添加了对应的依赖。例如: ```groovy ...

    Android ViewPager多页面滑动切换以及动画效果

    Android ViewPager实现仿QQ多页面滑动切换以及动画效果

    ViewPager无限循环左右滑动效果

    在实际项目中,我们可以创建一个示例应用,包含一个使用`InfinitePagerAdapter`的ViewPager,并设置一个包含多个页面的布局。每个页面可以是一个简单的TextView或者ImageView,以展示不同的内容。通过运行这个示例...

    ViewPager实现无限轮播+item点击事件

    总结,实现一个带有无限轮播和点击事件的ViewPager,需要自定义PagerAdapter、设置`offscreenPageLimit`属性、为item设置点击事件以及可能的页面变换动画。通过这样的方式,我们可以创建一个高效且交互丰富的Android...

    scrollview嵌套viewpager不显示、自适应高度

    自定义viewpager解决scrollview嵌套viewpager不显示和高度自适应

    通过SlidingMenu+Viewpager实现当前最流行的侧滑

    通过SlidingMenu+Viewpager实现当前最流行的侧滑 通过SlidingMenu库与Fragment来实现当前最为流行的侧滑模式。其实涉及到的知识点有: 1.SlidingMenu 2.Fragment 通过layout构建一个Fragment 通过preference 来...

    ScrollView嵌套ViewPager,可滑动,可动态设置ViewPager高度

    本示例“ScrollView嵌套ViewPager,可滑动,可动态设置ViewPager高度”就巧妙地解决了这两个组件的结合问题。 首先,让我们详细了解一下ScrollView。ScrollView是一个可滚动的视图容器,它只允许垂直方向的滚动。当...

    重写ViewPager修改滑动灵敏度

    1. 创建一个自定义的ViewPager类,继承自Android提供的`android.support.v4.view.ViewPager`(如果使用AndroidX库,则为`androidx.viewpager.widget.ViewPager`)。 2. 在自定义的ViewPager类中,我们需要覆盖`...

    ViewPager获取网络图片实现效果

    在布局文件中添加`ViewPager`,并为其设置适配器。适配器通常是一个继承自`PagerAdapter`的类,其中重写`instantiateItem()`和`destroyItem()`方法,以便在`ViewPager`中创建和销毁页面。 ```xml &lt;androidx....

    ViewPager示例

    4. 在Activity或Fragment中初始化ViewPager,设置适配器,并为ViewPager添加PageChangeListener来处理页面切换事件。 5. 自定义标题条的布局和逻辑,确保在页面切换时能正确更新标题。 通过这个示例,开发者可以...

Global site tag (gtag.js) - Google Analytics