自定义实现ViewPager圆形指示器

其实我这个就是实现四个点的效果,通过滑动viewpager来选中当前的点进行变色

类似这种效果图,颜色可以自己修改还有大小

不多说直接上代码

自定义属性xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="PagePointView">
        <attr name="circleInterval" format="dimension"/>
        <attr name="circleSizi" format="dimension"/>
        <attr name="circleNumber" format="integer"/>
        <attr name="selectIndex" format="integer"/>
        <attr name="circleSelectColor" format="color"/>
        <attr name="circleUnSelectColor" format="color"/>
    </declare-styleable>
</resources>

代码

public class PagePointView extends View {
    private Paint mPaint;
    private int mCircleInterval;//设置圆和点圆之间的间隔
    private int mCircleRadius;//设置圆的大小
    private int mCircleNumber;//设置圆的个数
    private int mSelectIndex = 1;//设置选中的圆
    private int mScreenWidht;
    private int mScreenHeight;
    private int mWidht;
    private int mHeight;
    private int mSelectColor;
    private int mUnSelectColor;


    public void setmCircleNumber(int mCircleNumber) {
        this.mCircleNumber = mCircleNumber;
    }

    public void setIndex(int selectIndex) {
        if (selectIndex > mCircleNumber) {
            this.mSelectIndex = mCircleNumber;
        } else {
            this.mSelectIndex = selectIndex;
        }
        postInvalidate();
    }

    public void setmSelectColor(int mSelectColor) {
        this.mSelectColor = mSelectColor;
    }

    public void setmUnSelectColor(int mUnSelectColor) {
        this.mUnSelectColor = mUnSelectColor;
    }

    public PagePointView(Context context) {
        this(context, null);
    }

    public PagePointView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PagePointView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.BLACK);
        mPaint.setStrokeWidth(20);
        mPaint.setStyle(Paint.Style.FILL);
        mScreenWidht = context.getResources().getDisplayMetrics().widthPixels;
        mScreenHeight = context.getResources().getDisplayMetrics().heightPixels;

        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PagePointView, defStyleAttr, 0);
        int count = ta.getIndexCount();
        for (int i = 0; i < count; i++) {
            int index = ta.getIndex(i);
            switch (index) {
                case R.styleable.PagePointView_circleInterval:
                    mCircleInterval = ta.getDimensionPixelSize(index, (int) TypedValue.applyDimension
                            (TypedValue.COMPLEX_UNIT_PX, 12, context.getResources().getDisplayMetrics()));
                    break;
                case R.styleable.PagePointView_circleNumber:
                    mCircleNumber = ta.getInt(index, 4);
                    break;
                case R.styleable.PagePointView_circleSizi:
                    mCircleRadius = ta.getDimensionPixelOffset(index, (int) TypedValue.applyDimension
                            (TypedValue.COMPLEX_UNIT_DIP, 12, context.getResources().getDisplayMetrics()));
                    break;
                case R.styleable.PagePointView_selectIndex:
                    mSelectIndex = ta.getInt(index, 1);
                    break;
                case R.styleable.PagePointView_circleSelectColor:
                    mSelectColor = ta.getColor(index, Color.WHITE);
                    break;
                case R.styleable.PagePointView_circleUnSelectColor:
                    mUnSelectColor = ta.getColor(index, Color.BLACK);
                    break;
            }
        }
        ta.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int wMode = MeasureSpec.getMode(widthMeasureSpec);
        int wSize = MeasureSpec.getSize(widthMeasureSpec);
        int hMode = MeasureSpec.getMode(heightMeasureSpec);
        int hSize = MeasureSpec.getSize(heightMeasureSpec);
        int viewWidht = 0;
        int viewHeight = 0;
        switch (wMode) {
            case MeasureSpec.EXACTLY:
                viewWidht = wSize;
                break;
            case MeasureSpec.AT_MOST:
                viewWidht = mCircleInterval + getPaddingLeft() + getPaddingRight() + mCircleRadius * 2;
                break;
            case MeasureSpec.UNSPECIFIED:
                viewWidht = wSize;
                break;
        }
        switch (hMode) {
            case MeasureSpec.EXACTLY:
                viewHeight = wSize;
                break;
            case MeasureSpec.AT_MOST:
                viewHeight = getPaddingBottom() + getPaddingTop() +  mCircleRadius * 2;
                break;
            case MeasureSpec.UNSPECIFIED:
                viewHeight = wSize;
                break;
        }
        setMeasuredDimension(resolveSize(viewWidht, widthMeasureSpec), resolveSize(viewHeight, heightMeasureSpec));
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidht = w;
        mHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int mViewWidht;
        for (int i = 1; i <= mCircleNumber; i++) {
            if (mSelectIndex == i) {
                mPaint.setColor(mSelectColor);
                canvas.drawCircle((2 * i - 1) * mCircleRadius + mCircleInterval * (i - 1), mCircleRadius, mCircleRadius, mPaint);
                continue;
            }
            mPaint.setColor(mUnSelectColor);
            canvas.drawCircle((2 * i - 1) * mCircleRadius + mCircleInterval * (i - 1), mCircleRadius, mCircleRadius, mPaint);
        }
    }


}

使用注意:必须在使用的布局xml文件的最外层布局中加上chipChildren=“false”否则只会显示选中的点

使用在viewpager的监听中设置选中的点位置

private class PageChangeListener implements ViewPager.OnPageChangeListener {
        @Override
        public void onPageScrollStateChanged(int position) {

        }

        @Override
        public void onPageScrolled(int position, float arg1, int arg2) {

        }

        @Override
        public void onPageSelected(int position) {
            // 设置底部小点选中状态
            pagePoint.setIndex(position+1);
        }

    }
可以将上面代码封装到自定义PagePointView中这里没有做过多操作,赖,我的原则能用就行封装后面在做


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值