ViewPager随着手指联动,且字体随之变色

前言

在此次项目中,总结了一下在ViewPager+Fragment的情况下,手指滑动ViewPager,使得指针一起联动,并且字体随之变色的效果,参考了鸿洋大神的两篇文章和其他开源代码,此次做了比较完整的处理,以后如果有需要的话,可以直接拿来用。

代码&& 实现

具体的一些代码块贴上来仅供参考

自定义的ScrollTabView,继承自view,类似指针,会随着手指的移动进行实时滑动


	private int mTabNum,mCurrentNum;
    private float mWidth,mTabWidth,mOffset;

    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private int mBeginColor,mEndColor;
    private LinearGradient mGradient;
    public ScrollTabView(Context context) {
        this(context,null);
    }

    public ScrollTabView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setTabNum(int num){
        mTabNum = num;
    }

    public void setCurrentNum(int num){
        mCurrentNum = num;
        mOffset = 0;
    }

    public void setOffset(int position,float offset){
        if(offset == 0){
            return;
        }

        mCurrentNum = position;
        mOffset = offset;
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(mTabWidth == 0){
            mWidth = getWidth();
            mTabWidth = mWidth / mTabNum;
        }

        //根据位置和偏移量来计算滑动条的位置
        float left = (mCurrentNum + mOffset) * mTabWidth;
        float right = left + mTabWidth;
        float top = getPaddingTop();
        float bottom = getHeight() - getPaddingBottom();

        LinearGradient gradient = new LinearGradient(left,getHeight(),right,getHeight(),mBeginColor,mEndColor, Shader.TileMode.CLAMP);
        mPaint.setShader(gradient);

        canvas.drawRect(left,top,right,bottom,mPaint);
    }

    public void setSelectedColor(int preColor,int nextColor){
        mBeginColor = preColor;
        mEndColor = nextColor;
    }

ThreeActivity的部分代码块,配合ScrollTabView使用

private void initEvents() {
        mViewPager.setAdapter(mAdapter);
        highLightTextView(0);
        mTextView.setText(mDatas.get(0));

        id_tab_line_iv.setTabNum(mDatas.size());
        id_tab_line_iv.setCurrentNum(0);
        id_tab_line_iv.setSelectedColor(Color.BLUE,Color.YELLOW);

        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                id_tab_line_iv.setOffset(position,positionOffset);
                if (positionOffset > 0)
                {
                    ColorTrackView left = mTabs.get(position);
                    ColorTrackView right = mTabs.get(position + 1);

                    left.setDirection(1);
                    right.setDirection(0);
                    left.setProgress( 1-positionOffset);
                    right.setProgress(positionOffset);
                }
            }

            @Override
            public void onPageSelected(int position) {
                resetTextViewColor();
                highLightTextView(position);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }


    /**
     * 高亮文本
     * @param position
     */
    protected void highLightTextView(int position)
    {
        View view = mTabs.get(position);
        if (view instanceof ColorTrackView)
        {
            ((ColorTrackView) view).setTextSize(48);
            mTextView.setText(mDatas.get(position));
        }
    }

    /**
     * 重置文本颜色
     */
    private void resetTextViewColor()
    {
        for (int i = 0; i < mTabs.size(); i++)
        {
            View view = mTabs.get(i);
            if (view instanceof ColorTrackView)
            {
                ((ColorTrackView) view).setTextSize(40);
            }
        }
    }

最后是鸿洋大神写的ColorTrackView这个类,主要处理字体变色这个效果,这个代码块我就不贴了

最后

Github项目地址,如果有什么不对的地方,欢迎留言指正,不胜感激.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值