自定义控件 — ViewPagerIndicator(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012153184/article/details/52518450

自定义控件 — ViewPagerIndicator (二)

本文的学习文参考自鸿洋的博客
http://blog.csdn.net/lmj623565791/article/details/42160391
有兴趣的朋友可以去仔细的阅读下

本片文章是在
自定义控件-ViewPagerIndicator(一)基础上逐步完善的,文章参考出自 鸿洋 大神的博客 仅练习 、积累 、学习。
首先看下效果图:

这里写图片描述

tab下面很简单就是ViewPager+FragmentAdapter 的组合。

主要的代码还是在indicator这里,这里主要有这么三点功能:

  1. 上面的tab能够跟随viewpage的滑动而滚动。

  2. 下面的indicator滚动到倒数第二个的时候会停留

  3. 滑动的时候文字的颜色会随着page的变化而改变

那么这么这三点功能也就是这篇文章的相对来上一篇文章来说的重点了。

要自己写的 ViewPagerIndicator 绑定 ViewPage 首先给 ViewPagerIndicator 开放一个入口 setViewPager(ViewPager mViewPager);在viewpage的linstener中的
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)关联到tab。position:是当前所显示的界面,positionOffset:是偏移量 取值为 0 ~ 1之间 可以理解成偏移当前page的百分比positionOffsetPixels 是偏移的像素,我们可以利用前两个参数来动态设置linearlayout和下划线的位置。代码如下:

    public  void setViewPager(ViewPager mViewPager){
        this.mViewPager=mViewPager;
        this.mViewPager.addOnPageChangeListener(new  ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                scroll(position,positionOffset);
            }
            @Override
            public void onPageSelected(int position) {
               TextView  textView= viewMap.get(true);
                textView.setTextColor(tabColor);
                TextView  textView1=(TextView) getChildAt(position);
                textView1.setTextColor(tabColorChecked);
                viewMap.put(true,textView1);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
                Log.e("TEST","onPageScrollStateChanged:"+state);

            }
        });

    }
    /**
     * 指示符滚动
     *
     * @param position 现在的位置
     * @param offset   偏移量 0 ~ 1
     */
    public void scroll(int position, float offset) {
        /**
         * 当item的个数大于  屏幕可见的个数的  并且 当前的posion >= 倒数第二个table的时候
         * 触发
         */
        if(mChildCount> mItemVisibleCount && position>=(mItemVisibleCount-2)){

            //移动到倒数第二个的时候让Linearlayout 停止移动
            if(position>=mChildCount-2){

            }else{
                this.scrollTo((position-(mItemVisibleCount-2))*mWidth+(int)(mWidth*offset),0);
            }
        }
        mLeft = (int) ((position + offset) * mWidth);
        invalidate();
    }

在onPageSelected()方法中我们简单的使用了TextView 一个控件创建了tab 利用map存储上次所改变的值 因为map的key是唯一的所以每次改变前一个的值之后,再用新的数据把map中的数据覆盖下。如果tab的样式复杂一些自己还可以把这里的布局改变下。

            public void onPageSelected(int position) {
               TextView  textView= viewMap.get(true);
                textView.setTextColor(tabColor);
                TextView  textView1=(TextView) getChildAt(position);
                textView1.setTextColor(tabColorChecked);
                viewMap.put(true,textView1);
            }

这里是设置tab数据的方法

    public void   setTabTitle(List<String> tabList,int currentPage){
        this.tabList = tabList;
        mChildCount=tabList.size();
        for(int  i =0;i<tabList.size();i++){
            final int j=i;
            TextView textView=  generateTextView(tabList.get(i));
            textView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mViewPager.setCurrentItem(j);
                }
            });
            addView(textView);
        }
        this.mViewPager.setCurrentItem(currentPage);
        viewMap.put(true,(TextView) getChildAt(currentPage));
    }

创建textView的方法

    public  TextView  generateTextView(String text){
        TextView textView=new TextView(getContext());
        LinearLayout.LayoutParams  layoutParams=new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        layoutParams.width=mWidth;
        textView.setText(text);
        textView.setTextColor(tabColor);
        textView.setGravity(Gravity.CENTER);
        textView.setLayoutParams(layoutParams);
        return  textView;
    }

最后呢可以添加一些回调的方法来把viewpage的监听数据传给下一级。

    interface  OnIndicatorChangeListener{
        public abstract void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
        public abstract  void onPageSelected(int position);
        public abstract  void onPageScrollStateChanged(int state);
    }
    public  void addIndicatorChangeListener(OnIndicatorChangeListener mIndicatorListener){
        this.mIndicatorListener=mIndicatorListener;
    }

代码已上传
地址

猜你喜欢

转载自blog.csdn.net/u012153184/article/details/52518450