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. ORA-01653:表空间扩展失败的问题

    以下内容来源于ORA-01653:表空间扩展失败的问题   今天发现,原来设备的数据表空间只有5M,已经满了,上网去找发现要进行扩展空间. 一.脚本修改方式: ----查询表空间使用情况---使用DB ...

  2. PHP 开发API接口 注册,登录,查询用户资料

    服务端 <?php require 'conn.php'; header('Content-Type:text/html;charset=utf-8'); $action = $_GET['ac ...

  3. KAFKA分布式消息系统[转]

    KAFKA分布式消息系统  转自:http://blog.chinaunix.net/uid-20196318-id-2420884.html Kafka[1]是linkedin用于日志处理的分布式消 ...

  4. SGU 111.Very simple problem

    题目大意:              求平方不大于n(n<=10^1000)的最大的数. 分析:              二分+高精度乘法 或者 高精度开方...               ...

  5. javascript——操作符(~、&、|、^、<<、>>)

    直接上代码吧! <script type="text/javascript"> //javascript操作符 //1.按位非~ var num1=25;// var ...

  6. xubuntu14.04截图,彻底到Linux一个半月后记

        前言 自学计算机技术,越到后面,越依赖ubuntu,以致于很多时候都是一开机就打开虚拟机上的ubuntu10.04,Linux已经变得越来越重要了. 2014-04-17,ubuntu14.0 ...

  7. 如何让同一个字段在不同的view中显示不同的内容

    many2one 字段默认显示 对象的name字段, 但也可以定义name_get方法显示不同的内容 如res.partner 对象可以根据 context 内容是否显示 客户的地址,职位,email ...

  8. Josephus

    利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来 代码如下: #include<stdio.h> #include<stdlib.h> typedef int status ...

  9. java枚举小结

    如何定义一个枚举类? //定义了4个等级 enum Level{ A,B,C,D } 枚举类的实质: class Level{ public static final Level A = new Le ...

  10. iOS - Blocks

    iOS中Blocks的介绍     1. 什么是Blocks Blocks是C语言的扩充功能.就是:带有自动变量的匿名函数. 类似C语言的函数指针.但Blocks不是一个指针,而是一个不带名字的函数, ...