Android 绘制反色文字进度条_第1张图片

一直想要实现一个这样的效果,终于弄出来了做个记录。

public class MyProgressView extends View {    private Paint mPaint;    private int viewWidth, viewHeight;    private float maxProgress = 100;    private float progress = 0;    private Bitmap progressBitmap, textBitmap;    private Canvas proCanvas, textCanvas;    private RectF dstRect, srcRect;    private Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.XOR);    public MyProgressView(Context context) {        this(context, null);    }    public MyProgressView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public MyProgressView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context);    }    private void init(Context context) {        mPaint = new Paint();        mPaint.setAntiAlias(true);        mPaint.setTextSize(100);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        viewWidth = w;        viewHeight = h;        progressBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888);        textBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888);        proCanvas = new Canvas(progressBitmap);        textCanvas = new Canvas(textBitmap);        srcRect = new RectF(0, 0, w, h);        dstRect = new RectF(0, 0, w, h);    }    public MyProgressView setMaxProgress(float maxProgress) {        this.maxProgress = maxProgress;        return this;    }    public void setProgress(float progress) {        this.progress = progress;        proCanvas.drawColor(Color.WHITE, PorterDuff.Mode.CLEAR);        mPaint.setColor(Color.BLUE);        proCanvas.drawRect(0, 0, viewWidth * (progress / maxProgress), viewHeight, mPaint);        String text = String.format(Locale.getDefault(), "%.2f%%", progress);        mPaint.setColor(Color.RED);        Paint.FontMetrics metrics = mPaint.getFontMetrics();        float fontHeight = metrics.bottom - metrics.top;        float textBaseY = viewHeight - (viewHeight - fontHeight) / 2 - metrics.bottom;        textCanvas.drawColor(Color.WHITE, PorterDuff.Mode.CLEAR);        textCanvas.drawText(text, (viewWidth - mPaint.measureText(text)) / 2, textBaseY, mPaint);        invalidate();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        int saveCount = canvas.saveLayer(srcRect, mPaint, Canvas.ALL_SAVE_FLAG);        //这里先绘制底部的进度条        canvas.drawBitmap(progressBitmap, null, srcRect, mPaint);        //设置混合模式        mPaint.setXfermode(xfermode);        //在回事文本        canvas.drawBitmap(textBitmap, null, dstRect, mPaint);        mPaint.setXfermode(null);        canvas.restoreToCount(saveCount);    }}

 

更多相关文章

  1. Android实现点击缩略图放大效果
  2. 怎样在android实现uc和墨迹天气那样的左右拖动效果
  3. Android中的动画效果设置
  4. Android 选项卡效果
  5. Android 控件布局实现卡片效果,阴影效果
  6. 去掉ScrollVIew拉到尽头时再拉的阴影效果

随机推荐

  1. 通过注解的 springboot+mybatis 多数据
  2. 0331作业
  3. iview的table合并相同的单元格
  4. 经济下行,程序员年底升职加薪指南
  5. 3.19作业
  6. webuploader文件上传到哪里的问题
  7. 新RabbitMQ精讲 提升工程实践能力 培养架
  8. 简单介绍编辑器vscode的安装与配置
  9. 解构赋值与流程控制
  10. mysql-innodb的事务日志