package com.example.progress.demo;

 import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View; import com.example.firstapp.R; @SuppressLint("DrawAllocation")
public class ProgressButton extends View {
private FontMetrics fm;
private int progress = 0;
private int textColor = Color.WHITE;
private Paint paint;
private float textSize = 10;
private int foreground;
private int backgroundColor;
private String text;
private int max = 100;
private int corner = 5;// 圆角的弧度
private OnProgressButtonClickListener buttonClickListener; public ProgressButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
} public ProgressButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
} private void init(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton);
this.backgroundColor = typedArray.getInteger(R.styleable.ProgressButton_background, Color.parseColor("#C6C6C6"));
this.foreground = typedArray.getInteger(R.styleable.ProgressButton_foreground, Color.rgb(20,131,214));
this.textColor = typedArray.getInteger(R.styleable.ProgressButton_textcolor, Color.WHITE);
this.max = typedArray.getInteger(R.styleable.ProgressButton_max, 100);
this.progress = typedArray.getInteger(R.styleable.ProgressButton_progress, 0);
this.text = typedArray.getString(R.styleable.ProgressButton_text);
this.textSize = typedArray.getDimension(R.styleable.ProgressButton_textSize, 20);
typedArray.recycle();
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5); /**
* 绘制背景
*/
RectF oval = new RectF(0, 0, getWidth(), getHeight()); paint.setColor(this.backgroundColor);
canvas.drawRoundRect(oval, corner, corner, paint); /***
* 绘制进度值
*/ paint.setColor(foreground);
if (progress <= corner) {
oval = new RectF(0, corner - progress, getWidth() * this.progress / this.max, getHeight()
- corner + progress);
canvas.drawRoundRect(oval, progress,progress, paint);
} else {
oval = new RectF(0, 0, getWidth() * this.progress / this.max, getHeight());
canvas.drawRoundRect(oval, corner, corner, paint);
} /***
* 绘制文本
*/
if ("".equals(text) || text == null) {
return;
}
paint.setTextSize(this.textSize);
fm = paint.getFontMetrics();
paint.setColor(this.textColor); float textCenterVerticalBaselineY = getHeight() / 2 - fm.descent + (fm.descent - fm.ascent) / 2;
canvas.drawText(this.text, (getMeasuredWidth() - paint.measureText(this.text)) / 2, textCenterVerticalBaselineY,
paint); } /**
* 设置最大值
*
* @param max
*/
public void setMax(int max) {
this.max = max;
} /**
* 设置文本提示信息
*
* @param text
*/
public void setText(String text) {
this.text = text;
} /**
* 设置进度条的颜色值
*
* @param color
*/
public void setForeground(int color) {
this.foreground = color;
} /**
* 设置进度条的背景色
*/
public void setBackgroundColor(int color) {
this.backgroundColor = color;
} /***
* 设置文本的大小
*/
public void setTextSize(int size) {
this.textSize = size;
} /**
* 设置文本的颜色值
*
* @param color
*/
public void setTextColor(int color) {
this.textColor = color;
} /**
* 设置进度值
*
* @param progress
*/
public void setProgress(int progress) {
if(progress>max){
return;
}
this.progress=progress;
//设置进度之后,要求UI强制进行重绘
postInvalidate();
} public int getMax(){
return max;
} public int getProgress(){
return progress;
} @SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
buttonClickListener.onClickListener();
break;
default:
break;
}
return true;
} public void setOnProgressButtonClickListener(OnProgressButtonClickListener clickListener){
buttonClickListener = clickListener;
} public interface OnProgressButtonClickListener{
public void onClickListener();
}
<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>

  

 }


Android按钮式进度条的更多相关文章

  1. Android 设置进度条背景

    Android 设置进度条背景 直接上代码 <ProgressBar android:id="@+id/progressBar" android:layout_width=& ...

  2. android 自定义进度条颜色

    android 自定义进度条颜色 先看图 基于产品经理各种自定义需求,经过查阅了解,下面是自己对Android自定义进度条的学习过程!   这个没法了只能看源码了,还好下载了源码, sources\b ...

  3. Android之进度条2

    我之前有写过一篇“Android之进度条1”,那个是条形的进度条(显示数字进度),这次实现圆形进度条. 点击查看Android之进度条1:http://www.cnblogs.com/caidupin ...

  4. android的进度条使用

    android的进度条 1.实现的效果 2.布局代码 先写一个my_browser.xml文件 存放WebView <?xml version="1.0" encoding= ...

  5. android多线程进度条

    多线程实现更新android进度条. 实例教程,详细信息我已经注释   android多线程进度条   01package com.shougao.hello; 02 03import android ...

  6. 最简单的android自定义进度条样式

    一.自定义圆形进度条样式 1.在安卓项目drawable目录下新建一个xml文件如下:<?xml version="1.0" encoding="utf-8&quo ...

  7. Android多种进度条使用详解

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...

  8. android ProgressBar 进度条的进度两端是圆角的方法

    转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44 ...

  9. Android -- ProgressBar(进度条的使用)

    我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. requestWindowFeature可以设置的值有:(具 ...

随机推荐

  1. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  2. Java方法-数组

    [Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...

  3. C# Activator.CreateInstance()

    C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...

  4. 无软驱加载raid驱动安装windows2003及其他微软操作系统

    [转载]http://blog.zol.com.cn/2650/article_2649199.html [另一篇]http://www.blue1000.com/bkhtml/c159/2013-0 ...

  5. SetTimer 和 OnTimer 的使用

    最近在公司做一个MFC项目,因为是MFC新手,所以在这里记录一些最近用到和学到的东西留着以后查阅. 今天遇到的一个问题是要在窗口刚刚初始化完成时自动检测一个配置文件是否存在(实际上就是检测是不是首次登 ...

  6. 104. Maximum Depth of Binary Tree(C++)

    104. Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is ...

  7. 用eval 动态编译代码

    eval 有另外一种用法, 其参数是作为一个字串表达式, 而不是代码块.在运行时, 它将字串临时编译成代码并且执行. 这很易用, 但也很危险, 因为有可能会把具有危害性的代码放到字串里. foreac ...

  8. iOS 获取项目名称及版本号

    可用于版本让用户手动检测是否有版本更新可用. NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  CFSho ...

  9. Java实现Linux下服务器程序的双守护进程

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问 ...

  10. java 下载文件 内容为空。

    检查下是不是io流没有关闭,记得关闭所有流.