自定义控件 - 可以显示进度的Button
来源:互联网 发布:淘宝设置全场满包邮 编辑:程序博客网 时间:2024/06/07 06:56
最近看到一些应用在下载文件的时候,并没有额外弹出进度条,而是很炫的使用启动下载任务的Button直接显示文件的下载进度,通过改变其背景色,从左向右推进,直到填满整个Button时,意味着下载任务的完成。
除了这种效果,还看到某酷的视频客户端,在观看过的视频对应的按钮上,会给该按钮添加一个描边效果,4条边,每条边代表25%的进度,由上沿开始,顺时针最终到左边沿,则代表100%的进度,这种效果也很不错。
自己也研究了一下,写了个自定义的button,下面是效果,
普通的填充效果:
描边的效果:
自定义Button的主要实现就是继承Button,并重写onDraw()方法,填充的效果实现起来相对简单一点:
if(currentType == TYPE_FILL) { mPaint.setColor(getContext().getResources().getColor(R.color.green_yellow)); mPaint.setAntiAlias(true); mPaint.setAlpha(128); mPaint.setStrokeWidth(1.0f); Rect rect = new Rect(); //先获取Button的边框 canvas.getClipBounds(rect); rect.left += getPaddingLeft(); //填充条的右边界根据当前进度来计算 rect.top += getPaddingTop(); rect.right = (rect.left - getPaddingLeft()) + (mProgress * getWidth() / 100) - getPaddingRight(); rect.bottom -= getPaddingBottom(); //绘制一个圆角的长条,这样相对好看一点 canvas.drawRoundRect(new RectF(rect), 8.0f, 8.0f, mPaint); }描边效果实现起来相对复杂一点,确切说是繁琐:
else if(currentType == TYPE_STROKE) { //初始化画笔 mPaint.setAntiAlias(true); mPaint.setColor(getContext().getResources().getColor(R.color.green_yellow)); mPaint.setAlpha(255); //获取Button的边框 Rect rect = new Rect(); canvas.getClipBounds(rect); Paint paint1, paint2, paint3, paint4; //根据当前进度,确定是绘制哪条边,其实也是绘制一个矩形,只不过这个矩形比较扁或是比较窄而已,类似一条边 if(mProgress >= 0 && mProgress < 25) { paint1 = new Paint(mPaint); Rect temp = new Rect(rect.left + getPaddingLeft(), rect.top + getPaddingTop(), rect.left + mProgress * (getWidth() - getPaddingLeft() - getPaddingRight()) / 25 - getPaddingRight(), rect.top + getPaddingTop() + 2); canvas.drawRect(temp, paint1); } else if(mProgress < 50) { paint1 = new Paint(mPaint); Rect rect1 = new Rect(rect.left + getPaddingLeft(), rect.top + getPaddingTop(), rect.right - getPaddingRight(), rect.top + getPaddingTop() + 2); canvas.drawRect(rect1, paint1); paint2 = new Paint(mPaint); Rect rect2 = new Rect(rect.right - getPaddingRight() - 2, rect.top + getPaddingTop(), rect.right - getPaddingRight(), rect.top + getPaddingTop() + (mProgress - 25) * (getHeight() - getPaddingTop() - getPaddingBottom()) / 25); canvas.drawRect(rect2, paint2); } else if(mProgress < 75) { paint1 = new Paint(mPaint); Rect rect1 = new Rect(rect.left + getPaddingLeft(), rect.top + getPaddingTop(), rect.right - getPaddingRight(), rect.top + getPaddingTop() + 2); canvas.drawRect(rect1, paint1); paint2 = new Paint(mPaint); Rect rect2 = new Rect(rect.right - getPaddingRight() - 2, rect.top + getPaddingTop(), rect.right - getPaddingRight(), rect.bottom - getPaddingBottom()); canvas.drawRect(rect2, paint2); paint3 = new Paint(mPaint); Rect rect3 = new Rect( rect.right - getPaddingRight() - (mProgress - 50) * (getWidth() - getPaddingLeft() - getPaddingRight()) / 25, rect.bottom - getPaddingBottom() - 2, rect.right - getPaddingRight(), rect.bottom - getPaddingBottom()); canvas.drawRect(rect3, paint3); } else if(mProgress <= 100) { paint1 = new Paint(mPaint); Rect rect1 = new Rect( rect.left + getPaddingLeft(), rect.top + getPaddingTop(), rect.right - getPaddingRight(), rect.top + getPaddingTop() + 2); canvas.drawRect(rect1, paint1); paint2 = new Paint(mPaint); Rect rect2 = new Rect( rect.right - getPaddingRight() - 2, rect.top + getPaddingTop(), rect.right - getPaddingRight(), rect.bottom - getPaddingBottom()); canvas.drawRect(rect2, paint2); paint3 = new Paint(mPaint); Rect rect3 = new Rect( rect.left + getCompoundPaddingLeft(), rect.bottom - getPaddingBottom() - 2, rect.right - getPaddingRight(), rect.bottom - getPaddingRight()); canvas.drawRect(rect3, paint3); paint4 = new Paint(mPaint); Rect rect4 = new Rect( rect.left + getCompoundPaddingLeft(), rect.bottom - getPaddingBottom() - (mProgress - 75) * (getHeight() - getPaddingTop() - getPaddingBottom()) / 25, rect.left + getPaddingLeft() + 2, rect.bottom - getPaddingBottom()); canvas.drawRect(rect4, paint4); } }
记得最后执行
super.onDraw(canvas);这样会让填充或是描边绘制在最底层,不会挡住Button原有的内容。
然后添加一个API,用于更新进度:
public void updateProgress(int progress) { if(progress >= 0 && progress <= 100) { mProgress = progress; invalidate(); } else if(progress < 0) { mProgress = 0; invalidate(); } else if(progress > 100) { mProgress = 100; invalidate(); } }
Demo的代码上传到了github上:https://github.com/YoungLeeForeverBoy/ProgressButton
- 自定义控件 - 可以显示进度的Button
- 一个显示等级进度的控件,可以自定义等级值、颜色、游标等。
- 带进度显示的Button
- 自定义控件 BUTTON的实现。
- 一个自定义的可以分页,排序,扩展显示grid控件
- 自定义可以显示考勤状态的日历控件
- Android的SeekBar进度详解和进度系列控件自定义
- 安卓自定义控件之可以滑动吸附的button按钮
- androd自定义view实现圆显示进度和百分比的控件
- SeekBar_显示进度的控件的监听
- Button控件+自定义Button控件
- 创建显示进度的 Windows 窗体控件
- seek bar 显示进度的控件
- 2.4 进度显示类控件的使用
- 带进度的button
- 自定义圆形进度控件
- 一个可以实时显示进度的自定义view,类似于listview中音乐播放背景变化的效果
- 自定义控件让TextView、Button的drawableLeft和drawableRight与文本一起居中显示
- 用python来开发webgame服务端(4)
- Entity Framework实践系列
- mysql基于二进制文件的恢复
- stopPropagation, preventDefault 和 return false 的区别
- mysql日志记录操作人员的信息以便于追踪
- 自定义控件 - 可以显示进度的Button
- GSM Layer3
- 深入分析ContentProvider
- No architectures to compile for
- android apk 签名
- JS——验证身份证号码
- 这是个什么问题
- SAX解析xml文件
- 如何使别人不能复制自己的html的内容