ViewPager2页面指示器(圆形)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1575af55ed49411580fe3cc8081833d8.gif#pic_center)
用法:
Vp2IndicatorView indicator = findViewById(R.id.indi);
ViewPager2 viewPager2 = findViewById(R.id.vp);
List<Integer> list = new ArrayList<>();
list.add(R.drawable.se1);
list.add(R.drawable.se2);
list.add(R.drawable.se3);
IndicatorPageAdapter adapter = new IndicatorPageAdapter(list);
viewPager2.setAdapter(adapter);
viewPager2.setOffscreenPageLimit(list.size());
viewPager2.setLayoutDirection(ViewPager2.LAYOUT_DIRECTION_LTR);
indicator.attachToViewPager2(viewPager2);
Vp2IndicatorView.java
public class Vp2IndicatorView extends View {
public static final int STYLE_CIRCLR_CIRCLE = 0;
private int mIndicatorItemDistance;
private ColorStateList mColorSelected, mColorUnSelected;
private int mIndicatorStyle = STYLE_CIRCLR_CIRCLE;
private int circleCircleRadius = 0;
private Paint mUnSelectedPaint, mSelectedPaint;
private RectF mIndicatorItemRectF;
private int mIndicatorItemWidth, mIndicatorItemHeight;
private int mIndicatorItemCount = 0;
private int mCurrentSeletedPosition = 0;
@RequiresApi(api = Build.VERSION_CODES.M)
public Vp2IndicatorView(Context context) {
this(context, null);
}
@RequiresApi(api = Build.VERSION_CODES.M)
public Vp2IndicatorView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
@RequiresApi(api = Build.VERSION_CODES.M)
public Vp2IndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
intPaint();
verifyItemCount();
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void init() {
mColorSelected = getContext().getColorStateList(R.color.error_red);
mColorUnSelected = getContext().getColorStateList(R.color.dialog_opinion_normal_text_color);
mIndicatorItemDistance = dip2px(6);
mIndicatorStyle = STYLE_CIRCLR_CIRCLE;
circleCircleRadius = dip2px(3);
}
private void intPaint() {
mUnSelectedPaint = new Paint();
mUnSelectedPaint.setStyle(Paint.Style.FILL);
mUnSelectedPaint.setAntiAlias(true);
mUnSelectedPaint.setColor(mColorUnSelected == null ?
Color.GRAY : mColorUnSelected.getDefaultColor());
mSelectedPaint = new Paint();
mSelectedPaint.setStyle(Paint.Style.FILL);
mSelectedPaint.setAntiAlias(true);
mSelectedPaint.setColor(mColorSelected == null ?
Color.RED : mColorSelected.getDefaultColor());
mIndicatorItemRectF = new RectF();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
mIndicatorItemWidth = 2 * circleCircleRadius * mIndicatorItemCount
+ (mIndicatorItemCount - 1) * mIndicatorItemDistance;
mIndicatorItemHeight = Math.max(heightSize, 2 * circleCircleRadius);
setMeasuredDimension(mIndicatorItemWidth, mIndicatorItemHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float cy = mIndicatorItemHeight / 2;
for (int i = 0; i < mIndicatorItemCount; i++) {
int cx = (i + 1) * circleCircleRadius + i * mIndicatorItemDistance;
canvas.drawCircle(cx, cy, circleCircleRadius,
i == mCurrentSeletedPosition ? mSelectedPaint : mUnSelectedPaint);
}
}
public void attachToViewPager2(ViewPager2 vp2) {
RecyclerView.Adapter pagerAdapter = vp2.getAdapter();
if (pagerAdapter != null) {
mIndicatorItemCount = pagerAdapter.getItemCount();
mCurrentSeletedPosition = vp2.getCurrentItem();
verifyItemCount();
}
vp2.registerOnPageChangeCallback(new OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
if (vp2 != null && pagerAdapter != null) {
mCurrentSeletedPosition = vp2.getCurrentItem();
}
postInvalidate();
}
});
}
private void verifyItemCount() {
if (mCurrentSeletedPosition >= mIndicatorItemCount) {
mCurrentSeletedPosition = mIndicatorItemCount - 1;
}
setVisibility((mIndicatorItemCount <= 1) ? GONE : VISIBLE);
}
public int dip2px(float dpValue) {
final float scale = getContext().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}