安卓圓心進度條CircleProgressView
阿新 • • 發佈:2018-12-29
最近做了一個圓形進度條控制元件 順便就把他抽出來噠直接貼出程式碼了 類中提供了各種顏色的設定 字型大小 已經進度的寬度 加上了進度回撥(雖然感覺沒啥卵用)
這是自定義的類 就這麼一個類咯
package com.example.progress; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; /** * 圓形進度條 * * @author yung7086 * <p> * 2015年12月9日 20:44:29 * <p> * ps: 圓環會自動根據寬度高度取小邊的大小的比例 你也可以自己設定圓環的大小@see #scrollBy(int, int) */ public class CircleProgress extends View { private int width;// 控制元件的寬度 private int height;// 控制元件的高度 private int radius;// 圓形的半徑 private int socktwidth = dp2px(8);// 圓環進度條的寬度 private Paint paint = new Paint(); private Rect rec = new Rect(); private int value = 70;// 百分比0~100; private int textSize = dp2px(70);// 文字大小 private Bitmap bitmap; @Deprecated float scale = 0.15f;// 中間背景圖片相對圓環的大小的比例 private int preColor = Color.parseColor("#2c2200");// 進度條未完成的顏色 private int progressColor = Color.parseColor("#6bb849");// 進度條顏色 private float paddingscale = 0.8f;// 控制元件內偏距佔空間本身的比例 private int CircleColor = Color.parseColor("#CCCCCC");// 圓中間的背景顏色 private int textColor = progressColor;// 文字顏色 private onProgressListener monProgress;// 進度時間監聽 private int startAngle = 270; RectF rectf = new RectF(); public CircleProgress(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { width = getWidth(); int size = height = getHeight(); if (height > width) size = width; radius = (int) (size * paddingscale / 2f); paint.setAntiAlias(true); paint.setColor(preColor); // 繪製最大的圓 進度條圓環的背景顏色(未走到的進度)就是這個哦 canvas.drawCircle(width / 2, height / 2, radius, paint); rectf.set((width - radius * 2) / 2f, (height - radius * 2) / 2f, ((width - radius * 2) / 2f) + (2 * radius), ((height - radius * 2) / 2f) + (2 * radius)); paint.setColor(progressColor); canvas.drawArc(rectf, startAngle, value * 3.6f, true, paint); paint.setColor(CircleColor); // 繪製用於遮住傘形兩個邊的小圓 canvas.drawCircle(width / 2, height / 2, radius - socktwidth, paint); if (bitmap != null) {// 繪製中間的圖片 int width2 = (int) (rectf.width() * scale); int height2 = (int) (rectf.height() * scale); rectf.set(rectf.left + width2, rectf.top + height2, rectf.right - width2, rectf.bottom - height2); canvas.drawBitmap(bitmap, null, rectf, null); } String v = value + "%"; paint.setColor(textColor); paint.setTextSize(textSize); paint.getTextBounds(v, 0, v.length(), rec); int textwidth = rec.width(); int textheight = rec.height(); // 繪製中間文字 canvas.drawText(v, (width - textwidth) / 2, ((height + textheight) / 2), paint); super.onDraw(canvas); } public int dp2px(int dp) { return (int) ((getResources().getDisplayMetrics().density * dp) + 0.5); } /** * 設定進度 * * @param value * <p> * ps: 百分比 0~100; */ public void setValue(int value) { if (value > 100) return; this.value = value; invalidate(); if (monProgress != null) monProgress.onProgress(value); } /** * 設定圓環進度條的寬度 px */ public CircleProgress setProdressWidth(int width) { this.socktwidth = width; return this; } /** * 設定文字大小 * * @param value */ public CircleProgress setTextSize(int value) { textSize = value; return this; } /** * 設定文字大小 * * @param value */ public CircleProgress setTextColor(int color) { this.textColor = color; return this; } /** * 設定進度條之前的顏色 * * @param color */ public CircleProgress setPreProgress(int precolor) { this.preColor = precolor; return this; } /** * 設定進度顏色 * * @param color */ public CircleProgress setProgress(int color) { this.progressColor = color; return this; } /** * 設定圓心中間的背景顏色 * * @param color * @return */ public CircleProgress setCircleBackgroud(int color) { this.CircleColor = color; return this; } /** * 設定圓相對整個控制元件的寬度或者高度的佔用比例 * * @param scale */ public CircleProgress setPaddingscale(float scale) { this.paddingscale = scale; return this; } /** * 設定開始的位置 * * @param startAngle * 0~360 * <p> * ps 0代表在最右邊 90 最下方 按照然後順時針旋轉 */ public CircleProgress setStartAngle(int startAngle) { this.startAngle = startAngle; return this; } public interface onProgressListener { void onProgress(int value); } }
下面是簡單的呼叫類了啊
佈局檔案很明顯沒啥package com.example.progress; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; /** * 測試類 * * @author yung7086 2015年12月9日 21:51:49 */ public class MainActivity extends Activity { private int preColor = Color.parseColor("#2c2200"); private int progressColor = Color.parseColor("#6bb849"); private int CircleColor = Color.parseColor("#CCCCCC"); private int textColor = Color.parseColor("#9bb879");; private CircleProgress pv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pv = (CircleProgress) findViewById(R.id.progressview1); pv.setTextColor(textColor).setCircleBackgroud(CircleColor) .setPreProgress(progressColor).setProgress(preColor) .setProdressWidth(50).setPaddingscale(0.8f); han.sendEmptyMessageDelayed(1, 100); } Handler han = new Handler() { public void handleMessage(android.os.Message msg) { pv.setValue(msg.what); han.sendEmptyMessageDelayed(msg.what + 1, 100); }; }; }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.progress.MainActivity" > <com.example.progress.CircleProgress android:id="@+id/progressview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ffffff" android:text="@string/hello_world" /> </RelativeLayout>
草草的寫了下 ..尊重作者 yung7086
PS:不貼出原始碼的博主勃不起
http://download.csdn.net/detail/yung7086/9342027