android自訂漸層圓環進度條

來源:互聯網
上載者:User

標籤:

先看下效果:

 

分析:比較常見於掃描結果、進度條等情境

利用canvas.drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)繪製圓弧

Paint的一些屬性定義粗細、顏色、樣式等

LinearGradient實現顏色的線型漸層

同樣的道理,可以畫出長條進度條,扇圖餅圖等,感興趣可以試下..

package com.liujing.progressviewdemo;/*** * 自訂圓弧進度條 *  * @author liujing */public class ProgressView extends View {    //分段顏色     private static final int[] SECTION_COLORS = { Color.GREEN, Color.YELLOW,            Color.RED };    private static final String[] ALARM_LEVEL = { "安全", "低危", "中危", "高危" };    private float maxCount;    private float currentCount;    private int score;    private String crrentLevel;    private Paint mPaint;    private Paint mTextPaint;    private int mWidth, mHeight;    public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context);    }    public ProgressView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public ProgressView(Context context) {        this(context, null);    }    private void init(Context context) {        mPaint = new Paint();        mTextPaint = new Paint();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        initPaint();        RectF rectBlackBg = new RectF(20, 20, mWidth - 20, mHeight - 20);        canvas.drawArc(rectBlackBg, 0, 360, false, mPaint);        mPaint.setColor(Color.BLACK);        canvas.drawText(score + "分", mWidth / 2, mHeight / 2, mTextPaint);        mTextPaint.setTextSize(40);        if (crrentLevel != null) {            canvas.drawText(crrentLevel, mWidth / 2, mHeight / 2 + 50,                    mTextPaint);        }        float section = currentCount / maxCount;        if (section <= 1.0f / 3.0f) {            if (section != 0.0f) {                mPaint.setColor(SECTION_COLORS[0]);            } else {                mPaint.setColor(Color.TRANSPARENT);            }        } else {            int count = (section <= 1.0f / 3.0f * 2) ? 2 : 3;            int[] colors = new int[count];            System.arraycopy(SECTION_COLORS, 0, colors, 0, count);            float[] positions = new float[count];            if (count == 2) {                positions[0] = 0.0f;                positions[1] = 1.0f - positions[0];            } else {                positions[0] = 0.0f;                positions[1] = (maxCount / 3) / currentCount;                positions[2] = 1.0f - positions[0] * 2;            }            positions[positions.length - 1] = 1.0f;            LinearGradient shader = new LinearGradient(3, 3, (mWidth - 3)                    * section, mHeight - 3, colors, null,                    Shader.TileMode.MIRROR);            mPaint.setShader(shader);        }        canvas.drawArc(rectBlackBg, 180, section * 360, false, mPaint);    }    private void initPaint() {        mPaint.setAntiAlias(true);        mPaint.setStrokeWidth((float) 40.0);        mPaint.setStyle(Style.STROKE);        mPaint.setStrokeCap(Cap.ROUND);        mPaint.setColor(Color.TRANSPARENT);        mTextPaint.setAntiAlias(true);        mTextPaint.setStrokeWidth((float) 3.0);        mTextPaint.setTextAlign(Paint.Align.CENTER);        mTextPaint.setTextSize(50);        mTextPaint.setColor(Color.BLACK);    }    private int dipToPx(int dip) {        float scale = getContext().getResources().getDisplayMetrics().density;        return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));    }    public int getScore() {        return score;    }    public String getCrrentLevel() {        return crrentLevel;    }    public void setCrrentLevel(String crrentLevel) {        this.crrentLevel = crrentLevel;    }    public float getMaxCount() {        return maxCount;    }    public float getCurrentCount() {        return currentCount;    }    public void setScore(int score) {        this.score = score;        if (score == 100) {            this.crrentLevel = ALARM_LEVEL[0];        } else if (score >= 70 && score < 100) {            this.crrentLevel = ALARM_LEVEL[1];        } else if (score >= 30 && score < 70) {            this.crrentLevel = ALARM_LEVEL[2];        } else {            this.crrentLevel = ALARM_LEVEL[3];        }        invalidate();    }    /***     * 設定最大的進度值     *      * @param maxCount     */    public void setMaxCount(float maxCount) {        this.maxCount = maxCount;    }    /***     * 設定當前的進度值     *      * @param currentCount     */    public void setCurrentCount(float currentCount) {        this.currentCount = currentCount > maxCount ? maxCount : currentCount;        invalidate();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);        if (widthSpecMode == MeasureSpec.EXACTLY                || widthSpecMode == MeasureSpec.AT_MOST) {            mWidth = widthSpecSize;        } else {            mWidth = 0;        }        if (heightSpecMode == MeasureSpec.AT_MOST                || heightSpecMode == MeasureSpec.UNSPECIFIED) {            mHeight = dipToPx(15);        } else {            mHeight = heightSpecSize;        }        setMeasuredDimension(mWidth, mHeight);    }}

 Demo:http://files.cnblogs.com/files/liujingg/ProgressViewDemo.rar

android自訂漸層圓環進度條

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.