Android 自定义圆形进度条

来源:互联网 发布:gltools优化王者 编辑:程序博客网 时间:2024/05/22 08:01


转载请标明出处: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个paddingprivate 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();}@Overrideprotected 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);}@Overrideprotected synchronized void onDraw(Canvas canvas) {super.onDraw(canvas);// 移动画布canvas.translate(defaultWidth / 2, defaultWidth / 2);// 移动画布的原因。所以中心点是 0 ,0canvas.drawCircle(0, 0, defaultWidth / 2 - padding, mGrayPaint);// 得到进度progress = getProgress();// 开始的角度---->变化---->最大360float 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);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {// TODO Auto-generated method stubsuper.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;@Overrideprotected 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>




0 0
原创粉丝点击