Android按钮式进度条

  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 }

技术分享

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。