最近自己在做个app名叫Bingo,其中需要上传图片到服务器上,于是仿QQ传输图片的效果实现图片上传功能,效果如下面两张图片:

初始化Paint画笔

    private Paint imagePaint;
    private Paint textPaint;

    protected void initPainters(Context context) {
        imagePaint = new Paint();
        imagePaint.setAntiAlias(true);
        imagePaint.setStyle(Paint.Style.FILL);

        textPaint = new TextPaint();
        textPaint.setColor(Color.parseColor("#FFFFFF"));
        textPaint.setTextSize(DisplayUtil.sp2px(context, 18));
        textPaint.setAntiAlias(true);
        setProgressStart();
    }

处理上传进度和显示的文字

    private int progress = 0;

    //获得显示的文字
    private String getDrawText() {
        if (progress >= 0 && progress <= 100) {
            return progress+"%";
        }
        return null;
    }

    public void setProgressStart() {
        setProgress(-1);
    }

    public void setProgressFinish() {
        setProgress(101);
    }

    public void setProgress(int progress){
        this.progress=progress;
        postInvalidate(); //更新View绘制
    };

在onDraw中画出图形

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

        if (progress < 0) {
            imagePaint.setColor(Color.parseColor("#70000000"));
            canvas.drawRect(0, 0, getWidth(), getHeight(), imagePaint);
        } else if (progress > 100) {
            imagePaint.setColor(Color.parseColor("#00000000"));
            canvas.drawRect(0, 0, getWidth(), getHeight(), imagePaint);
        } else {
            imagePaint.setColor(Color.parseColor("#70000000"));
            canvas.drawRect(0, 0, getWidth(), getHeight() - getHeight() * progress / 100, imagePaint);

            imagePaint.setColor(Color.parseColor("#00000000"));
            canvas.drawRect(0, getHeight() - getHeight() * progress / 100, getWidth(), getHeight(), imagePaint);

            String text = getDrawText();
            if (!TextUtils.isEmpty(text)) {
                float textHeight = textPaint.descent() + textPaint.ascent();
                canvas.drawText(text, (getWidth() - textPaint.measureText(text)) / 2.0f, (getWidth() - textHeight) / 2.0f, textPaint);
            }
        }
    }

整理小的知识点

要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置, 上面用到的主要方法如下:

TextPaint是Paint的子类,用它可以很方便的进行文字的绘制,一般情况下遇到绘制文字的需求时,我们一般用TextPaint所提供的方法。 绘制text的高度的时候会用到textPaint.descent()和textPaint.ascent(),他们的意义如下:

Baseline是基线,在Android中,文字的绘制都是从Baseline处开始的,Baseline往上至字符“最高处”的距离我们称之为ascent(上坡度),Baseline往下至字符“最低处”的距离我们称之为descent(下坡度),leading(行间距)则表示上一行字符的descent到该行字符的ascent之间的距离。