Android按钮式进度条
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按钮式进度条的更多相关文章
- Android 设置进度条背景
Android 设置进度条背景 直接上代码 <ProgressBar android:id="@+id/progressBar" android:layout_width=& ...
- android 自定义进度条颜色
android 自定义进度条颜色 先看图 基于产品经理各种自定义需求,经过查阅了解,下面是自己对Android自定义进度条的学习过程! 这个没法了只能看源码了,还好下载了源码, sources\b ...
- Android之进度条2
我之前有写过一篇“Android之进度条1”,那个是条形的进度条(显示数字进度),这次实现圆形进度条. 点击查看Android之进度条1:http://www.cnblogs.com/caidupin ...
- android的进度条使用
android的进度条 1.实现的效果 2.布局代码 先写一个my_browser.xml文件 存放WebView <?xml version="1.0" encoding= ...
- android多线程进度条
多线程实现更新android进度条. 实例教程,详细信息我已经注释 android多线程进度条 01package com.shougao.hello; 02 03import android ...
- 最简单的android自定义进度条样式
一.自定义圆形进度条样式 1.在安卓项目drawable目录下新建一个xml文件如下:<?xml version="1.0" encoding="utf-8&quo ...
- Android多种进度条使用详解
在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...
- android ProgressBar 进度条的进度两端是圆角的方法
转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44 ...
- Android -- ProgressBar(进度条的使用)
我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. requestWindowFeature可以设置的值有:(具 ...
随机推荐
- Alljoyn 概述(2)
AllJoyn 基本概念 • 总线(Bus) – 实现P2P通信的基础 – AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus • 总线附件(Bus Attachment) ...
- 在用VC编译下debug和release的什么区别
DEBUG和RELEASE 版本差异及调试相关问题:. 内存分配问题 1. 变量未初始化.下面的程序在debug中运行的很好. thing * search(thin ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- Cocos2dx开发(2)——Win8.1下Cocod2dx 3.2环境搭建
正式开始搭建cocos2dx环境,回到熟悉的VS 1.Python安装配置 这一步很简单,下载Python2.7.3,笔者直接用软件助手直接下载安装,最后配置环境变量 如下成功 2.cocos2dx ...
- Javascript中的函数(Function)与对象(Object)的关系
今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一 ...
- MySQL5.7.9免安装版配置方法
1. 解压MySQL压缩包 将下载的MySQL压缩包解压到自定义目录下,我的解压目录是: "D:\Program Files\mysql-5.7.9-win32" ...
- 浏览器JS报错Uncaught RangeError: Maximum call stack size exceeded?
JavaScript错误:Uncaught RangeError: Maximum call stack size exceeded 堆栈溢出 原因:有小类到大类的递归查询导致溢出 解决方法思想: A ...
- getJSON回调函数不执行问题?
利用getJSON异步请求时,回调函数不执行,不知道是什么问题? php 返回数据 header("Content-type:text/json"); echo json_enco ...
- C#实现对邮件的发送
首先是邮件帮助类 using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; u ...
- python连接mysql之pymysql模块
以下demo均以python2中的mysqldb模块 一.插入数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import MySQLdb conn = MyS ...