转载请标明出处:http://blog.csdn.net/u013598111/article/details/50151481,本文出自:【JunTao_sun】
效果图:
<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:wjt="http://schemas.android.com/apk/res/com.example.progressbar"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
>
<com.example.progressbar.myProgressBar
android:id="@+id/id_progress1"
android:layout_width="100dp"
android:layout_height="100dp"
wjt:color_circle="#FF6600"
wjt:color_num="#0000FF"
/>
<com.example.progressbar.myProgressBar
android:id="@+id/id_progress2"
android:layout_width="100dp"
android:layout_height="100dp"
wjt:color_circle="#990000ff"
wjt:color_num="#FF0099"
/>
<com.example.progressbar.myProgressBar
android:id="@+id/id_progress3"
android:layout_width="100dp"
android:layout_height="100dp"
wjt:color_circle="#FFFF00"
wjt:color_num="#33FF00"
/>
</LinearLayout>
</span>
自定义View. <span style="font-size:18px;">public class myProgressBar extends ProgressBar {
private static final String TAG = "myProgressBar";
private Paint mCirclePaint;
private Paint mGrayPaint;
private Paint textPaint;
// 字体的范围
private Rect mbound;
// 字体宽度
private int textWidth;
// 字体高度
private int textHeigth;
// 字体默认的左边距
private int textPaddingLeft = 50;
// 半径
private int radius;
private int progress;
// 控件宽度 宽高相等
private int defaultWidth;
private String text;
private String defaultString = 0 + "%";
private Rect defalutRect;
// 默认给10个padding
private int padding = 10;
public myProgressBar(Context context) {
this(context, null);
}
public myProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public myProgressBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context
.obtainStyledAttributes(attrs, R.styleable.MyView);
int progressColor_cricle = a.getColor(R.styleable.MyView_color_circle, 0Xff0000ff);
int progressColor_num = a
.getColor(R.styleable.MyView_color_num, 0Xff0000ff);
a.recycle();
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(0xffff0000);
textPaint.setDither(true);
textPaint.setColor(progressColor_num);
// textPaint.setStyle(Paint.Style.STROKE);
textPaint.setTextSize(20);
mCirclePaint = new Paint();
mCirclePaint.setColor(progressColor_cricle);
mCirclePaint.setDither(true);
mCirclePaint.setStyle(Paint.Style.STROKE);
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStrokeWidth(4);
mGrayPaint = new Paint();
mGrayPaint.setColor(0xadadadad);
mGrayPaint.setDither(true);
mGrayPaint.setStyle(Paint.Style.STROKE);
mGrayPaint.setAntiAlias(true);
mbound = new Rect();
defalutRect = new Rect();
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
Log.e(TAG, "onMeasure");
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
textPaint.getTextBounds(defaultString, 0, defaultString.length(),
defalutRect);
int resultWidth = 0;
int resultHeigth = 0;
resultWidth = measureWidth(widthMeasureSpec);
resultHeigth = measureHeight(heightMeasureSpec);
// defaultWidth = Math.min(resultWidth, resultHeigth); 第二种
// int w=Math.min(getMeasuredWidth(), getMeasuredHeight());//第二种
setMeasuredDimension(resultWidth, resultHeigth);
}
/**
*
* 测量不同模式下的高度
*
* @param measureSpec
* @return
*/
private int measureHeight(int measureSpec) {
int mode = MeasureSpec.getMode(measureSpec);
int val = MeasureSpec.getSize(measureSpec);
int result = 0;
switch (mode) {
case MeasureSpec.EXACTLY:
result = val;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.UNSPECIFIED:
result = defalutRect.height() + textPaddingLeft * 2;
break;
}
result = mode == MeasureSpec.AT_MOST ? Math.min(result, val) : result;
return result;
}
/**
*
* 测量不同模式下的宽度
*
* @param measureSpec
* @return
*/
private int measureWidth(int measureSpec) {
int mode = MeasureSpec.getMode(measureSpec);
int val = MeasureSpec.getSize(measureSpec);
int result = 0;
switch (mode) {
case MeasureSpec.EXACTLY:
result = val;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.UNSPECIFIED:
// result = mTextBound.width();
result = defalutRect.width() + textPaddingLeft * 2;
break;
}
result = mode == MeasureSpec.AT_MOST ? Math.min(result, val) : result;
Log.e(TAG, result + "measureWidth00");
return result;
}
/**
* 测量字体的宽高
*
* @param str
*/
private void textMeasure(String str) {
textWidth = (int) textPaint.measureText(str);
FontMetrics fm = textPaint.getFontMetrics();
textHeigth = (int) -(fm.descent + fm.ascent);
textPaint.getTextBounds(str, 0, str.length(), mbound);
}
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 移动画布
canvas.translate(defaultWidth / 2, defaultWidth / 2);
// 移动画布的原因。所以中心点是 0 ,0
canvas.drawCircle(0, 0, defaultWidth / 2 - padding, mGrayPaint);
// 得到进度
progress = getProgress();
// 开始的角度---->变化---->最大360
float startAngle = getProgress() * 1.0f / getMax() * 360;
text = getProgress() + "%";
textMeasure(text);
canvas.save();
// 画进度的数字
drawText(canvas, text);
// 画圆
drawCircle(canvas, startAngle);
canvas.restore();
}
/**
* 画圆
*
* @param canvas
* @param startAngle
* 角度值
*/
private void drawCircle(Canvas canvas, float startAngle) {
// 画弧度 因为移动画布了 所以画弧的矩形如下
canvas.drawArc(new RectF(-(defaultWidth / 2 - padding),
-(defaultWidth / 2 - padding), defaultWidth / 2 - padding,
defaultWidth / 2 - padding), 0, startAngle, false, mCirclePaint);
}
/**
* 画数字
*
* @param canvas
* @param str
*/
private void drawText(Canvas canvas, String str) {
canvas.drawText(str, -textWidth / 2, textHeigth / 2, textPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
defaultWidth=w;
}</span>
<span style="font-size:18px;">package com.example.progressbar;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private static final int SEND_PROGRESS1 = 0;
private static final int SEND_PROGRESS2 = 1;
private static final int SEND_PROGRESS3 = 2;
private static final int SEND_PROGRESS4 = 3;
Handler handle = new Handler() {
int progress1,progress2,progress3,progress4;
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SEND_PROGRESS1:
progress1++;
progressbar1.setProgress(progress1);
if (progress1 >= 100) {
handle.removeMessages(SEND_PROGRESS1);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS1, 40);
break;
case SEND_PROGRESS2:
progress2++;
progressbar2.setProgress(progress2);
if (progress2 >= 100) {
handle.removeMessages(SEND_PROGRESS2);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS2, 70);
break;
case SEND_PROGRESS3:
progress3++;
progressbar3.setProgress(progress3);
if (progress3 >= 100) {
handle.removeMessages(SEND_PROGRESS3);
}
handle.sendEmptyMessageDelayed(SEND_PROGRESS3, 60);
break;
}
}
;
};
private myProgressBar progressbar1, progressbar2, progressbar3,
progressbar4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressbar1 = (myProgressBar) findViewById(R.id.id_progress1);
progressbar2 = (myProgressBar) findViewById(R.id.id_progress2);
progressbar3 = (myProgressBar) findViewById(R.id.id_progress3);
handle.sendEmptyMessage(SEND_PROGRESS1);
handle.sendEmptyMessage(SEND_PROGRESS2);
handle.sendEmptyMessage(SEND_PROGRESS3);
handle.sendEmptyMessage(SEND_PROGRESS4);
}
}
</span>