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可以设置的值有:(具 ...
随机推荐
- ORACLE每组只保留一条记录
删除同一组内其他记录 DELETE from memactivities a where exists(select 1 FROM (select Uuid,ci_no,lst_upd_ts,ROW_ ...
- os项目icon和default 等相关图标命名规则和大小设置
最新的参考apple官网地址:https://developer.apple.com/library/ios/qa/qa1686/_index.html,网页下面有详细的使用方法(ios7以后的) 转 ...
- javaScript 删除数组中指定元素
Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- CentOS Device eth0 does not seem to be present 解决方案
1. vi /etc/udev/rules.d/70-persistent-net.rules 记录eth1 的网卡地址 2.vi /etc/sysconfig/network-scrpits/ifc ...
- visualSVN server库迁移(转)
转自:http://blog.csdn.net/yuhuijun_1/article/details/9762683 首先,VisualSVN Server Manager,包含两个路径,一个是安装路 ...
- nginx1.8+php5.6.10 服务器编译安装备忘2015-06
又要重新装一台阿里云服务器.开始想用脚本,但发现脚本的程序版本都比较低 还是手动编译最新版本 开始前 更新服务器到最新版本 #yum makecache #yum update //分区挂数据盘 # ...
- 我摘录的js代码
1.修改样式 document.getElementByIdx( "div1").style.display = "none"; 2.鼠标悬停图标变小手 sty ...
- 解决xp共享的批处理文件
在空白地方点右键选择新建一个文本文档,将默认的“新建 文本文档.txt”文件名改名为以下红色加粗字体内容,再复制红色内容以下的黑字部分到改名后的文档.其他文件生成的方法相同.完成后根据需要双击CMD扩 ...
- CodeForces 554B(扫房间)
CodeForces 554B Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u ...