问题:有时候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>
核心代码:
- 覆写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;
}
}