Android自定义View之滑杆内部带数字的SeekBar

一、需求确认首先我们要明确需求,要做一个什么样的Seekbar,分析清楚业务需求,再开始做。如图,产品大佬给的图是这样子的:当然,作为一个工程师,第一步当然是去问问度娘,看有没有好的轮子,然后去github上淘淘金。我始终认为这是一个优秀工程师该有的解决问题的方法,哈哈~ 找过一圈之后,发现并没有适合的轮子可以用,这时心里开始咒骂产品了,“提的什么鬼需求,那么非主流”。但是骂完还得撸起...
摘要由CSDN通过智能技术生成

一、需求确认

首先我们要明确需求,要做一个什么样的Seekbar,分析清楚业务需求,再开始做。如图,产品大佬给的图是这样子的:

当然,作为一个工程师,第一步当然是去问问度娘,看有没有好的轮子,然后去github上淘淘金。我始终认为这是一个优秀工程师该有的解决问题的方法,哈哈~ 找过一圈之后,发现并没有适合的轮子可以用,这时心里开始咒骂产品了,“提的什么鬼需求,那么非主流”。但是骂完还得撸起袖子干啊。

二、该怎么做

首先我们分析,这个控件该怎么去实现。首先,我们知道,要画一条直线来当作进度条;然后呢,我们要画一个圆角矩形,矩形中要有数字。查看了SeekBar的源码,发现他有一个监听器回调滑杆事件,那么咱们也要有。好的,现在确认了需要的4样东西:直线、圆角矩形、数字、监听器。就可开工了。

三、开整

我们首先顶一个半径pointRadius,因为滑杆一般为圆形或者圆角正方形。还有线的高度lineHeight,progress进度值。这里还是贴代码了。

    private int pointRadius = 45;//圆脚默认半径
    private int pointColor = R.color.dream_2;//圆脚默认颜色

    private int lineHeight = 10;//线默认高度
    private int lineClor = R.color.dream_1;//线默认颜色

    private int progress = 0;
    private final int PROGRESS_MIN = 0;
    private final int PROGRESS_MAX = 100;

当然,要画三个东西,就要准备三支笔。

    private Paint linePaint;
    private Paint pointPaint;
    private Paint textPaint;

最后还有一个监听器,三个回调方法分别是开始的时候回调,滑动中回调,滑动完回调。当然可以根据自己的逻辑增加回调方法。

  private OnProgressChangedListener progressChangedListener;

    public interface OnProgressChangedListener {
        void onStartChange(View view);

        void onProgressChange(View view, int progress);

        void onProgressChanged(View view, int progress);
    }

首先,我们画一条线

canvas.drawLine(pointRadius / 2, getHeight() / 2, getWidth() - pointRadius / 2, getHeight() / 2, linePaint);

然后画个圆角矩形(正方形)

        RectF r2 = new RectF();                           //RectF对象
        r2.left = getCx() - pointRadius;                                 //左边
        r2.top = getHeight() / 2 - pointRadius;                                 //上边
        r2.right = getCx() + pointRadius;                                   //右边
        r2.bottom = getHeight() / 2 + pointRadius;                              //下边
        canvas.drawRoundRect(r2, 20, 20, pointPaint);

然后就是画字了(文本)

        if (progress > 9 && progress < 100) {
            canvas.drawText("" + progress, getCx() - 32, getHeight() / 2 + pointRadius / 3, textPaint);
        } else if (progress > 99) {
            canvas.drawText("" + progress, getCx() - pointRadius + 2, getHeight() / 2 + pointRadius / 3, textPaint);
        } else {
            canvas.drawText("" + progress, getCx() - pointRadius / 3, getHeight() / 2 + pointRadius / 3, textPaint);
        }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值