ViewPagerIndicator 根据ViewPager 的个数进行滑动

问题:有时候ViewPager 的个数很多的时候,下方的小圆点会溢出手机屏幕,如何解决?(自己写的例子是下方是长方块的)

解决方法:自己自定义View,继承LinearLayout,重写dispatchDraw (),为啥不覆写 onDraw(),自己去看看源码的解释。

attr 代码:

<declare-styleable name="ViewPagerIndicator">
	<attr name="selected_color" format="color|reference" /> //长方块底色
	<attr name="default_color" format="color|reference" /> //长方块选中的颜色
	<attr name="length" format="dimension|reference" /> //长方块的长度
	<attr name="height" format="dimension|reference" /> //长方块的高度
	<attr name="distance" format="dimension|reference" /> //长方块之间的间距
</declare-styleable>

核心代码:

  1. 覆写dispatchDraw (),画出viewPager 个数对应的 小方块

    @Override
	protected void dispatchDraw(Canvas canvas) {
		if (this.mNumSize <= 0) return;

		int width = canvas.getWidth();
		int height = canvas.getHeight();
		mVisibleNumber = (int) (width / this.mItemWidth);

		canvas.translate((float) (width / 2), (float) (height / 2));
		canvas.save();

		float startX = -(Math.min(this.mNumSize, mVisibleNumber) * this.mItemWidth) / 2 + this.mLength * 2 + this.mDistance / 2;
		float stopX = (float) startX + this.mLength;
		for (int i = 0; i < this.mNumSize; ++i) {
			canvas.drawLine(startX + (float) i * mItemWidth, 0.0F, stopX + (float) i * mItemWidth, 0.0F, this.paintStroke);
		}

		float startF = startX + this.mOffset;
		float stopF = stopX + this.mOffset;
		canvas.drawLine(startF, 0.0F, stopF, 0.0F, this.paintFill);

		canvas.restore();
		super.dispatchDraw(canvas);
	}

2.设置对应的ViewPager,进行滚动监听

    public ViewPagerIndicator setViewPager(ViewPager viewPager, int size) {
		this.mViewPager = viewPager;
		this.mNumSize = size;

		viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
			private int lastValue = -1;

			@Override
			public void onPageSelected(int position) {
			}

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

				boolean isLeft = mIsLeft;
				if (this.lastValue / 10 > positionOffsetPixels / 10) {
					isLeft = false;
				} else if (this.lastValue / 10 < positionOffsetPixels / 10) {
					isLeft = true;
				}

				if (mNumSize > 0) move(positionOffset, position % mNumSize, isLeft);
				if (mNumSize >= mVisibleNumber) scroll(position, positionOffset);
				this.lastValue = positionOffsetPixels;

				invalidate();

			}

			@Override
			public void onPageScrollStateChanged(int state) {

			}
		});

		return this;
	}

3.move方法是对选中的小方块进行移动,scroll方法是当到屏幕的最左或者最右的时候进行移动

    public void scroll(int position, float offset) {
		if (position >= this.mVisibleNumber -1) {
			this.scrollTo((position - this.mVisibleNumber + 1) * (int) this.mItemWidth + (int) (this.mItemWidth * offset), 0);
		}
	}


	public void move(float percent, int position, boolean isLeft) {
		this.mIsLeft = isLeft;
		if (position == this.mNumSize - 1 && !isLeft) {
			this.mOffset = (1.0F - percent) * (float) position * this.mItemWidth;
		} else if (position == this.mNumSize - 1 && isLeft) {
			this.mOffset = (1.0F - percent) * (float) position * this.mItemWidth;
		} else {
			this.mOffset = (percent + (float) position) * this.mItemWidth;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值