自定义带进度条的圆角button

自定义带进度条的圆角button

1、实现效果

在这里插入图片描述
在这里插入图片描述

2、代码实现

public class UpdateButton extends View {

    private static final String TAG = "UpdateButton";

    private Paint mPaint;
    private int mBlueColor;
    private int mBackGroundColor;
    private int mWhiteColor;
    private float mBaseLine;
    private RectF mRectF;
    private String mButtonText;
    private float mProgress;
    private int mTextSize;
    private int mMaxProgress = 1;
    private int mMinProgress = 0;

    public UpdateButton(Context context) {
        super(context);
        init();
    }

    public UpdateButton(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public UpdateButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mBlueColor = getResources().getColor(R.color.button_and_text_color);
        mBackGroundColor = getResources().getColor(R.color.button_progress_color);
        mWhiteColor = getResources().getColor(R.color.bar_color);
        mTextSize = sp2px(12);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setTextAlign(Paint.Align.CENTER);
        mPaint.setTextSize(mTextSize);
        mPaint.setColor(mBlueColor);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mRectF = new RectF(2.5f, 2.5f, w - 2.5f, h - 2.5f);
        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
        mBaseLine = h / 2 + (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.save();

        float height = mRectF.height();
        float width = mRectF.right;
        if (height <= 0 || width <= 0) {
            return;
        }
        mPaint.setShader(null);
        mPaint.setColor(mBlueColor);

        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPaint.setAntiAlias(true);

        float radius = height / 2;

        canvas.drawRoundRect(mRectF, radius, radius, mPaint);

        mPaint.setStyle(Paint.Style.FILL);

        if (mProgress > mMinProgress && mProgress < mMaxProgress) {
            LinearGradient progressGradient = new LinearGradient(0, 0, width, 0,
                    new int[]{mBackGroundColor, Color.TRANSPARENT},
                    new float[]{mProgress, 0},//两种颜色占的比重
                    LinearGradient.TileMode.CLAMP);
            mPaint.setShader(progressGradient);
            canvas.drawRoundRect(mRectF, radius, radius, mPaint);
            mPaint.setShader(null);
        }
        if (TextUtils.isEmpty(mButtonText)) {
            return;
        }
        canvas.drawText(mButtonText, width / 2, mBaseLine, mPaint);
        mRectF.right = width;
    }

    /**
     * 设置按钮文本
     *
     * @param buttonText
     */
    public void setButtonText(String buttonText) {
        this.mButtonText = buttonText;
        invalidate();
    }

    public String getButtonText() {
        return mButtonText;
    }

    /**
     * 设置文本字体大小
     *
     * @param textSize
     */
    public void setTextSize(int textSize) {
        this.mTextSize = sp2px(textSize);
    }

    /**
     * sp to dp
     *
     * @param sp
     * @return dp
     */
    private int sp2px(float sp) {
        final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;
        return (int) (sp * fontScale + 0.5f);
    }

    public void setProgress(float progress) {
        mProgress = progress / 100f;
        invalidate();
    }

    public float getProgress() {
        return mProgress;
    }

    public void updateButtonUI(String text, float progress) {
        setButtonText(text);
        setProgress(progress);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义横向进度条的右边圆角,你可以创建一个自定义进度条样式,并在该样式中添加一个圆角背景。以下是一种实现方式: 1. 创建一个 XML 文件,在其中定义自定义进度条样式。例如,创建一个名为 `custom_progress_bar.xml` 的文件,并将以下代码添加到文件中: ```xml <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 进度条背景 --> <item android:id="@android:id/background"> <shape> <corners android:radius="20dp" /> <!-- 设置背景圆角半径 --> <solid android:color="#CCCCCC" /> <!-- 设置背景颜色 --> </shape> </item> <!-- 进度条进度 --> <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="20dp" /> <!-- 设置进度条圆角半径 --> <solid android:color="#FF0000" /> <!-- 设置进度条颜色 --> </shape> </clip> </item> </layer-list> ``` 在上述代码中,我们使用 `<layer-list>` 标签来定义进度条的层次结构。`<item>` 标签用于指定不同部分(如背景和进度)的样式。使用 `<corners>` 标签可以设置圆角半径,`<solid>` 标签用于设置背景和进度条的颜色。 2. 在布局文件中使用自定义进度条样式。在你的布局文件中,将进度条的样式设置为自定义的样式。例如: ```xml <ProgressBar android:layout_width="match_parent" android:layout_height="10dp" android:progressDrawable="@drawable/custom_progress_bar" /> ``` 在上述代码中,我们将进度条的 `progressDrawable` 属性设置为我们刚刚创建的自定义进度条样式。 通过以上步骤,你可以创建一个具有右边圆角自定义横向进度条。你可以根据需要调整圆角半径和颜色来满足你的设计要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值