也許我們在Android開發時有這樣一個需求,在請求網絡圖片時,如果在圖片還未完全顯示完全時,顯示一個比較漂亮簡潔的進度條,是不是會顯得很人性化呢?比如像下圖所示:
下面我們就來實現一下這樣一個進度條:主要代碼先貼上,LoadingCircleView
- /**
- * 圓形加載進度條
- *
- * @author way
- *
- */
- publicclass LoadingCircleView extends View {
- privatefinal Paint paint;
- privatefinal Context context;
- private Resources res;
- privateint max = 100;
- privateint progress = 0;
- privateint ringWidth;
- // 圓環的顏色
- privateint ringColor;
- // 進度條顏色
- privateint progressColor;
- // 字體顏色
- privateint textColor;
- // 字的大小
- privateint textSize;
- private String textProgress;
- public LoadingCircleView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- this.context = context;
- this.paint = new Paint();
- this.res = context.getResources();
- this.paint.setAntiAlias(true); // 消除鋸齒
- this.ringWidth = dip2px(context, 3); // 設置圓環寬度
- this.ringColor = Color.BLACK;// 黑色進度條背景
- this.progressColor = Color.WHITE;// 白色進度條
- this.textColor = Color.BLACK;// 黑色數字顯示進度;
- this.textSize = 15;// 默認字體大小
- }
- public LoadingCircleView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public LoadingCircleView(Context context) {
- this(context, null);
- }
- /**
- * 設置進度條最大值
- *
- * @param max
- */
- publicsynchronizedvoid setMax(int max) {
- if (max < 0)
- max = 0;
- if (progress > max)
- progress = max;
- this.max = max;
- }
- /**
- * 獲取進度條最大值
- *
- * @return
- */
- publicsynchronizedint getMax() {
- return max;
- }
- /**
- * 設置加載進度,取值范圍在0~之間
- *
- * @param progress
- */
- publicsynchronizedvoid setProgress(int progress) {
- if (progress >= 0 && progress <= max) {
- this.progress = progress;
- invalidate();
- }
- }
- /**
- * 獲取當前進度值
- *
- * @return
- */
- publicsynchronizedint getProgress() {
- return progress;
- }
- /**
- * 設置圓環背景色
- *
- * @param ringColor
- */
- publicvoid setRingColor(int ringColor) {
- this.ringColor = res.getColor(ringColor);
- }
- /**
- * 設置進度條顏色
- *
- * @param progressColor
- */
- publicvoid setProgressColor(int progressColor) {
- this.progressColor = res.getColor(progressColor);
- }
- /**
- * 設置字體顏色
- *
- * @param textColor
- */
- publicvoid setTextColor(int textColor) {
- this.textColor = res.getColor(textColor);
- }
- /**
- * 設置字體大小
- *
- * @param textSize
- */
- publicvoid setTextSize(int textSize) {
- this.textSize = textSize;
- }
- /**
- * 設置圓環半徑
- *
- * @param ringWidth
- */
- publicvoid setRingWidthDip(int ringWidth) {
- this.ringWidth = dip2px(context, ringWidth);
- }
- /**
- * 通過不斷畫弧的方式更新界面,實現進度增加
- */
- @Override
- protectedvoid onDraw(Canvas canvas) {
- int center = getWidth() / 2;
- int radios = center - ringWidth / 2;
- // 繪制圓環
- this.paint.setStyle(Paint.Style.STROKE); // 繪制空心圓
- this.paint.setColor(ringColor);
- this.paint.setStrokeWidth(ringWidth);
- canvas.drawCircle(center, center, radios, this.paint);
- RectF oval = new RectF(center - radios, center - radios, center
- + radios, center + radios);
- this.paint.setColor(progressColor);
- canvas.drawArc(oval, 90, 360 * progress / max, false, paint);
- this.paint.setStyle(Paint.Style.FILL);
- this.paint.setColor(textColor);
- this.paint.setStrokeWidth(0);
- this.paint.setTextSize(textSize);
- this.paint.setTypeface(Typeface.DEFAULT_BOLD);
- textProgress = (int) (1000 * (progress / (10.0 * max))) + "%";
- float textWidth = paint.measureText(textProgress);
- canvas.drawText(textProgress, center - textWidth / 2, center + textSize
- / 2, paint);
- super.onDraw(canvas);
- }
- /**
- * 根據手機的分辨率從 dp 的單位 轉成為 px(像素)
- */
- publicstaticint dip2px(Context context, float dpValue) {
- finalfloat scale = context.getResources().getDisplayMetrics().density;
- return (int) (dpValue * scale + 0.5f);
- }
- }
其他的,我就不多說了,跟正常ProgressBar用法類似了,有需要的可以下載源碼試試效果:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2013年資料/5月/14日/Android之加載圖片時自定義進度條
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11