1 package com.example.progress.demo;
2
3 import android.annotation.SuppressLint;
4 import android.content.Context;
5 import android.content.res.TypedArray;
6 import android.graphics.Canvas;
7 import android.graphics.Color;
8 import android.graphics.Paint;
9 import android.graphics.Paint.FontMetrics;
10 import android.graphics.RectF;
11 import android.util.AttributeSet;
12 import android.util.Log;
13 import android.view.MotionEvent;
14 import android.view.View;
15
16 import com.example.firstapp.R;
17
18 @SuppressLint("DrawAllocation")
19 public class ProgressButton extends View {
20 private FontMetrics fm;
21 private int progress = 0;
22 private int textColor = Color.WHITE;
23 private Paint paint;
24 private float textSize = 10;
25 private int foreground;
26 private int backgroundColor;
27 private String text;
28 private int max = 100;
29 private int corner = 5;// 圆角的弧度
30 private OnProgressButtonClickListener buttonClickListener;
31
32 public ProgressButton(Context context, AttributeSet attrs) {
33 super(context, attrs);
34 init(context, attrs);
35 }
36
37 public ProgressButton(Context context, AttributeSet attrs, int defStyle) {
38 super(context, attrs, defStyle);
39 init(context, attrs);
40 }
41
42 private void init(Context context, AttributeSet attrs) {
43 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton);
44 this.backgroundColor = typedArray.getInteger(R.styleable.ProgressButton_background, Color.parseColor("#C6C6C6"));
45 this.foreground = typedArray.getInteger(R.styleable.ProgressButton_foreground, Color.rgb(20,131,214));
46 this.textColor = typedArray.getInteger(R.styleable.ProgressButton_textcolor, Color.WHITE);
47 this.max = typedArray.getInteger(R.styleable.ProgressButton_max, 100);
48 this.progress = typedArray.getInteger(R.styleable.ProgressButton_progress, 0);
49 this.text = typedArray.getString(R.styleable.ProgressButton_text);
50 this.textSize = typedArray.getDimension(R.styleable.ProgressButton_textSize, 20);
51 typedArray.recycle();
52 }
53
54 @Override
55 protected void onDraw(Canvas canvas) {
56 super.onDraw(canvas);
57 paint = new Paint();
58 paint.setAntiAlias(true);
59 paint.setStrokeWidth(5);
60
61 /**
62 * 绘制背景
63 */
64 RectF oval = new RectF(0, 0, getWidth(), getHeight());
65
66 paint.setColor(this.backgroundColor);
67 canvas.drawRoundRect(oval, corner, corner, paint);
68
69 /***
70 * 绘制进度值
71 */
72
73 paint.setColor(foreground);
74 if (progress <= corner) {
75 oval = new RectF(0, corner - progress, getWidth() * this.progress / this.max, getHeight()
76 - corner + progress);
77 canvas.drawRoundRect(oval, progress,progress, paint);
78 } else {
79 oval = new RectF(0, 0, getWidth() * this.progress / this.max, getHeight());
80 canvas.drawRoundRect(oval, corner, corner, paint);
81 }
82
83 /***
84 * 绘制文本
85 */
86 if ("".equals(text) || text == null) {
87 return;
88 }
89 paint.setTextSize(this.textSize);
90 fm = paint.getFontMetrics();
91 paint.setColor(this.textColor);
92
93 float textCenterVerticalBaselineY = getHeight() / 2 - fm.descent + (fm.descent - fm.ascent) / 2;
94 canvas.drawText(this.text, (getMeasuredWidth() - paint.measureText(this.text)) / 2, textCenterVerticalBaselineY,
95 paint);
96
97
98 }
99
100 /**
101 * 设置最大值
102 *
103 * @param max
104 */
105 public void setMax(int max) {
106 this.max = max;
107 }
108
109 /**
110 * 设置文本提示信息
111 *
112 * @param text
113 */
114 public void setText(String text) {
115 this.text = text;
116 }
117
118 /**
119 * 设置进度条的颜色值
120 *
121 * @param color
122 */
123 public void setForeground(int color) {
124 this.foreground = color;
125 }
126
127 /**
128 * 设置进度条的背景色
129 */
130 public void setBackgroundColor(int color) {
131 this.backgroundColor = color;
132 }
133
134 /***
135 * 设置文本的大小
136 */
137 public void setTextSize(int size) {
138 this.textSize = size;
139 }
140
141 /**
142 * 设置文本的颜色值
143 *
144 * @param color
145 */
146 public void setTextColor(int color) {
147 this.textColor = color;
148 }
149
150 /**
151 * 设置进度值
152 *
153 * @param progress
154 */
155 public void setProgress(int progress) {
156 if(progress>max){
157 return;
158 }
159 this.progress=progress;
160 //设置进度之后,要求UI强制进行重绘
161 postInvalidate();
162 }
163
164 public int getMax(){
165 return max;
166 }
167
168 public int getProgress(){
169 return progress;
170 }
171
172 @SuppressLint("ClickableViewAccessibility")
173 @Override
174 public boolean onTouchEvent(MotionEvent event) {
175 switch (event.getAction()) {
176 case MotionEvent.ACTION_UP:
177 buttonClickListener.onClickListener();
178 break;
179 default:
180 break;
181 }
182 return true;
183 }
184
185 public void setOnProgressButtonClickListener(OnProgressButtonClickListener clickListener){
186 buttonClickListener = clickListener;
187 }
188
189 public interface OnProgressButtonClickListener{
190 public void onClickListener();
191 }
192
<declare-styleable name="ProgressButton">
<attr name="background" format="color" />
<attr name="foreground" format="color" />
<attr name="textcolor" format="color" />
<attr name="max" />
<attr name="progress" />
<attr name="textSize" />
<attr name="text" format="string" />
</declare-styleable>
193 }