自定义代码画圆, 轮播图指示器。直接上代码


public class BannerDotView extends View {
    private int mNormalRadius = dp2px(8);
    private int mSelectedRadius = dp2px(8);
    private int mNormalWidth = dp2px(8);
    private int mNormalHeight = dp2px(8);
    private int mSpace = dp2px(5);
    private int maxRadius;
    private int mCount = 4;
    private int mCurrentPosition=0;
    protected Paint mPaint = new Paint();

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

    public BannerDotView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BannerDotView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int count = mCount;
        if (count <= 1) {
            return;
        }

        mNormalRadius = mNormalWidth / 2;
        mSelectedRadius = mNormalHeight / 2;
        //考虑当 选中和默认 的大小不一样的情况
        maxRadius = Math.max(mSelectedRadius, mNormalRadius);
        //间距*(总数-1)+选中宽度+默认宽度*(总数-1)
        int width = (count - 1) * mSpace + mNormalWidth + mNormalWidth * (count - 1);
        setMeasuredDimension(width, Math.max(mNormalWidth, mNormalWidth));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int count = mCount;
        if (count <= 1) {
            return;
        }
        float left = 0;
        for (int i = 0; i < count; i++) {
            mPaint.setColor(mCurrentPosition == i ? Color.BLUE : Color.GRAY);
            int indicatorWidth = mCurrentPosition == i ? mNormalWidth : mNormalWidth;
            int radius = mCurrentPosition == i ? mSelectedRadius : mNormalRadius;
            canvas.drawCircle(left + radius, maxRadius, radius, mPaint);
            left += indicatorWidth + mSpace;
        }
    }

    protected int dp2px(float dp) {
        final float scale = getContext().getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐