Android 带文字的进度条,文字颜色随进度条的增加而渐变的效果

Android自带的ProgressBar是不带文字的,加文字的话可以参考这篇博客:http://blog.csdn.net/lixiaodaoaaa/article/details/9852327

本篇博客主要讲有了文字之后的ProgressBar文字的颜色随着进度条增加,看起来有一种进度条覆盖了文字的颜色,模仿点击下载和暂停等效果,效果如下:

在这里插入图片描述

代码中通过不断的重载setProgress方法,不停的执行onDraw方法,采用图像混合模式,对进度条和文字进行进度条重绘。主要代码如下:


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mWidth = getWidth() * mProgress / 100;//进度作一下处理,解决不同分辨率的适配问题
        mPaint.getTextBounds(mPercentText, 0, mPercentText.length(), mPercentRect);//为了获取文字的宽高以及坐标位置,get之后,rect.centerX才有值
        mPaint.getTextBounds(mPauseText, 0, mPauseText.length(), mPauseRect);
        int textX = (getWidth() / 2) - mPauseRect.centerX();//获取“暂停”文字的中心横坐标
        int textY = (getHeight() / 2) - mPauseRect.centerY();
        int percentX = (getWidth() / 2) - mPercentRect.centerX();//获取百分比文字的中心横坐标
        int percentY = (getHeight() / 2) - mPercentRect.centerY();
        Bitmap srcBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        Canvas srcCanvas = new Canvas(srcBitmap);
        switch (mStateType) {
            case Constant.DEFAULT://默认初始化状态
                drawTextUI(canvas, textX, textY, mDefaultText, srcBitmap, srcCanvas);
                break;
            case Constant.PAUSE:
                drawTextUI(canvas, textX, textY, mPauseText, srcBitmap, srcCanvas);
                break;
            case Constant.DOWNLOAD:
                drawTextUI(canvas, percentX, percentY, mPercentText, srcBitmap, srcCanvas);
                break;
            case Constant.FINISH:
                mPaint.setColor(Color.WHITE);
                canvas.drawText(mFinishText, textX, textY, mPaint);
                break;
            default:
                drawTextUI(canvas, textX, textY, mDefaultText, srcBitmap, srcCanvas);
                break;

其中的drawTextUI方法主要控制图像混合模式,从而实现渐变,核心代码如下:

    mPaint.setXfermode(mPorterDuffXfermode);// 设置混合模式
    mPaint.setColor(Color.WHITE);
    RectF rectF = new RectF(0, 0, mWidth, getHeight());//mWidth是不断变化的
    // 绘制源图形
    srcCanvas.drawRect(rectF, mPaint);
    // 绘制目标图
    canvas.drawBitmap(srcBitmap, 0, 0, null);
    // 清除混合模式
    mPaint.setXfermode(null);
    // 恢复画笔颜色
    mPaint.setColor(Color.parseColor("#00b38a"));

MainActivity主要控制下载和暂停的部分逻辑:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private TextProgressBar mProgressView;
    private final int FOR_SCROLL = 1;
    private final int DELAY = 500;
    private float mProgress;
    private int mStateType = Constant.DOWNLOAD;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case FOR_SCROLL:
                    if(mProgress < 100) {
                        mProgress += 4.0;
                        mProgressView.setProgress(mProgress);
                        mProgressView.setStateType(Constant.DOWNLOAD);
                        mHandler.sendEmptyMessageDelayed(FOR_SCROLL, DELAY);
                    } else {
                        mStateType = Constant.FINISH;
                        mProgressView.setProgress(100);
                        mProgressView.setStateType(mStateType);
                    }
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mProgressView = (TextProgressBar) findViewById(R.id.textProgress);
        mProgressView.setOnClickListener(this);
        mProgressView.setStateType(Constant.DEFAULT);
        String text = String.format("%.1f%%", 53.6897);
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View v) {
        if(v == null) {
            return;
        }
        if(v.getId() == R.id.textProgress) {
            switch (mStateType) {
                case Constant.DOWNLOAD:
                    mStateType = Constant.PAUSE;
                    mHandler.sendEmptyMessageDelayed(FOR_SCROLL, DELAY);
                    break;
                case Constant.PAUSE:
                    mStateType = Constant.DOWNLOAD;
                    mProgressView.setStateType(Constant.PAUSE);
                    mHandler.removeMessages(FOR_SCROLL);
                    break;
                case Constant.FINISH:
                    Toast.makeText(MainActivity.this, getResources().getString(R.string.ok), Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeMessages(FOR_SCROLL);
    }
}

代码未作优化,大体上实现大概功能,有问题一起交流
项目源码,点击下载

2019-1-15更新
因为之前的源码链接积分被系统改的过高,特地重新上传了一份。
点击下载

2020-3-2更新
也是因为积分无缘无故被改高了,又重新手动传了一份
点击下载

2020年9月27日14:55:10更新
同上,积分问题,又被改成了50积分,再次上传一份
点击下载

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值