progressbar使用方法:进度画面大小,进度画面背景,进度百分比
前一段时间,因为项目须要研究了下progressbar,发现这个小东西还真是不简单。在这个小控件的显示效果上,花费的时间远大于预估的工作量。话说程序猿一直是这样,预估的工作量远少于实际。。。
先说明一下,这里主要是针对水平进度条进行说明的,关于圆形进度条或者其它进度条能够依此类推。android系统默认的进度条是圆形的,用到水平进度条一般都会加上这样一个属性:"@android:style/Widget.ProgressBar.Horizontal"。笔者所发现进度条特殊的地方都是从这里開始的。建议大家看这篇文章的时候最好关联源代码或者关联SDK,看到这个属性的内部定义。
对于textview这类控件,直接使用例如以下两个属性一般就能够达到GUI要求的宽度和高度,
android:layout_width="wrap_content"
android:layout_height="wrap_content"
而对于progressbar,GUI除了会对这个控件本身的大小做一定要求,很多其它的会对这个控件里面的进度条大小有要求。这里就到了第一个特殊点:progressbar相对于textview这类控件来说须要控制两个地方的大小:1.这个控件本身的大小,也就是实际占领的位置;2.这个控件里面用来显示运行进度的那块大小。
我们假设只设置上面两个属性,会发现里面的进度条不过随着控件本身的增大而同比例增大,也就达不到GUI要求的效果。笔者在阅读Widget.ProgressBar.Horizontal属性源代码时候发现,其内部定义是这种:
<style name="Widget.ProgressBar.Horizontal">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
<item name="android:minHeight">20dip</item>
<item name="android:maxHeight">20dip</item>
<item name="android:mirrorForRtl">true</item>
</style>
有没有注意到,这里还有minHeight,maxHeight这两个属性,尝试改动了一下达到效果。好了到这里设置进度条进度大小的属性就说完了。一个GUI的效果图会给出控件多大,里面进度和和控件边沿之间的间隙是多大。我们能够直接在layout_width这样的属性中设置控件大小,在android:maxHeight里面设置进度的大小。
GUI除了会要求设定进度的大小,还会要求改变进度本身的大小比方图片或者角度。是的,GUI什么的不会轻易放过程序猿的。有没有注意到,上面的源代码有个这种定义
<item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
推測突破口就是这里,查看了一下google的定义貌似非常复杂的样子。原来就里面的那个进度,其背景颜色还要分为:1.单独的背景颜色;2.进度的背景颜色;3.第二进度的背景颜色。并且全部的颜色值,转角大小都是用代码给写出来的,着实是复杂。这里直接就告诉大家吧,通过我们的研究以及其它项目组充满血泪的经验总结,在这里直接用GUI画的图是最方便的。一般自己定义的进度条背景色,终于实现出来的代码都是以下的格式
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background" android:drawable="@drawable/******" />
<item android:id="@android:id/progress" android:drawable="@drawable/*******" />
</layer-list>
看到这里是不是感觉人生充满了欢乐。
最后在给进度条加上百分比,原以为android会提供这个属性,查了半天真的木有。最后我们想到了两种实现方法,貌似都还不错。先说说第一个方法的思路,继承progress控件通过控件绘图回调方法onDraw(Canvas),在画出一个百分比出来。关于第二个方法,也是新定一个控件,用framelayout封装一个progressbar,一个textview。就个人来说比較倾向第一种方法,这个貌似能逐步加深对android一些理解,对于第二个方法呢,在各个平台上具有通用性,也不错。直接给出第一个方法的实现:
package com.example.android.apis; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextPaint;
import android.widget.ProgressBar; public class PercentProgressbar extends ProgressBar { String text;
Paint mTextPaint; public PercentProgressbar(Context context) {
super(context);
initText();
} @Override
public synchronized void setProgress(int progress) {
super.setProgress(progress);
setText(progress);
} @Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
Rect rect = new Rect();
this.mTextPaint.getTextBounds(this.text, 0, this.text.length(), rect);
int x = (getWidth() / 2) - rect.centerX();
int y = (getHeight() / 2) - rect.centerY();
canvas.drawText(this.text, x, y, this.mTextPaint);
} private void initText() {
this.mTextPaint = new TextPaint();
this.mTextPaint.setColor(Color.WHITE);
//还能够设置字体的其它属性
} private void setText(int progress){
int i = (progress * 100)/this.getMax();
this.text = String.valueOf(i) + "%";
}
}
这里也參考了一下网上的实现,只是发现网络上大多数使用的画笔都是paint,建议大家还是使用textpaint。否则进度条里面的文字和界面其它地方的文字总是有些不一样的地方,GUI不会放过你们的。。。在强调一点,进度条里面的百分比,是不应该随着系统字体大小变化而变化的,所以设置字体的时候请记得使用DP做为单位。在上面的第二个方法里面直接在textview控件里面设置字体大小就能够了,那么在第一种方法里面应该怎么设置字体大小呢,这里就留给大家思考把。
总结一下,文章解说的是progressbar,只是并木有介绍怎么使用progressbar显示运行进度什么的。类似这样的最基础的知识,能够看下google的APIDemo。这里解说了progressbar设置内部进度大小,设置内部进度图片,怎么显示百分比。相信关于progressbar最常见的,可是Demo里面没有提到的,都在这里了。
progressbar使用方法:进度画面大小,进度画面背景,进度百分比的更多相关文章
- Android中ProgressBar的使用-通过Handler与Message实现进度条显示
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...
- Android自定义进度条-带文本(文字进度)的水平进度条(ProgressBar)
水平进度条,显示进度的文本随着进度而移动. 效果如下,截的静态图. 代码如下 TextProgressBar.java public class TextProgressBar extends Pro ...
- Android开发 ---基本UI组件4:拖动事件、评分进度条、圆圈式进度条、进度条控制
Android开发 ---基本UI组件4 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding=" ...
- 居于Web的进度条实现思路(下载百分比)
http://www.cnblogs.com/wfyfngu/p/4866434.html 在传统桌面项目中,进度条随处可见,但作为一个很好的用户体验,却没有在如今主流的B/S程序中得到传承,不能不说 ...
- jquery自定义进度条与h5原生进度条
介绍一款自定义的进度条 <div class="box-nine"> <div class="progress"> <!--一 ...
- 改善用户体验,用图片的自身变化以及进度通知摆脱传统的进度条,okhttp,Canvas,Paint实现
转载请注明出处:王亟亟的大牛之路 从最開始的白页面等待,到后来的进度条告知用户.到如今的WebBO/微信这样的先下缩略图点击才又一次下大图的方式,我们开发人员对用户感知的注意度越来越高.昨天刷微博的时 ...
- Java web实时进度条整个系统共用(如java上传进度条、导入excel进度条等)
先上图: 这上文件上传的: 这是数据实时处理的: 1:先说说什么是进度条:进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务量的大小,和可能需要处理时间,显示方式 ...
- ios swift 实现饼状图进度条,swift环形进度条
ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...
- CProgressCtrl进度条控件实现进度滚动效果
关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 实现这个效果的函数为SetMarquee(_In_ BOOL ...
随机推荐
- 字符串匹配之horspool算法(简化的BM算法)
前面介绍在BF,KMP这些算法的时候老是提到BM这个东西,究竟这什么东西,有啥高深的,这些问题我们如今不去考虑.不知道,认真读前几篇文章的读者有没有发现前面的算法都是从模式串的前面開始匹配的,那我们就 ...
- JQuery.ajax一解
关于JQuery.ajax方法,好处也不用多说了,主要是想记下ajax中的一些参数: url:请求的目标地址,为一个字符串,格式为:http://localhost:端口号/User/方法名.eg:现 ...
- C# 大小写转换
全部大写: string upper = str.ToUpper() 全部小写: string lower = str.ToLower(); str是需要转换的字符.
- React初步
今天整理一下自己关于react的学习笔记. 什么是React? 学习某一个框架首先得知道这个框架是干什么的,它的特点是什么,有哪些优点和缺点. React有4个特点 组件化 虚拟DOM 单项数据流 j ...
- xhtml规范
在使用XHTML语言进行网页制作时,必须要遵循一定的语法规范.下面进行详细讲解,其中具体内容可以分为以下几点. 文档方面: 必须定义文档类型(DTD)和你的名字空间 标签方面: 所有标签均要小写,合理 ...
- (转)2.4.1 基础知识--添加服务引用与Web引用的区别
<Web服务开发学习实录>第2章构建ASP.NET Web服务,本章我们将学习创建Web服务的各种方法,并重点对使用Visual Studio创建ASP.NET Web服务和修改Web服务 ...
- CODEVS 3139 栈练习3
3139 栈练习3 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 比起第一题,本题加了另外一个操作,访问栈顶元素(编号3,保 ...
- Linux下运行C++程序出现"段错误(核心已转储)"的原因
今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错 这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题 ...
- eclipse 添加jar包的方式
参考资料地址:http://blog.csdn.net/mazhaojuan/article/details/21403717
- 一个很简单的jQuery插件实例教程(菜鸟级)
很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ...