android自訂進度條漸層圓形_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://xiazai.jb51.net/201507/yuanma/ProgressViewDemo(jb51.net).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.