前一段时间,因为项目须要研究了下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使用方法:进度画面大小,进度画面背景,进度百分比的更多相关文章

  1. Android中ProgressBar的使用-通过Handler与Message实现进度条显示

    场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...

  2. Android自定义进度条-带文本(文字进度)的水平进度条(ProgressBar)

    水平进度条,显示进度的文本随着进度而移动. 效果如下,截的静态图. 代码如下 TextProgressBar.java public class TextProgressBar extends Pro ...

  3. Android开发 ---基本UI组件4:拖动事件、评分进度条、圆圈式进度条、进度条控制

    Android开发 ---基本UI组件4 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding=" ...

  4. 居于Web的进度条实现思路(下载百分比)

    http://www.cnblogs.com/wfyfngu/p/4866434.html 在传统桌面项目中,进度条随处可见,但作为一个很好的用户体验,却没有在如今主流的B/S程序中得到传承,不能不说 ...

  5. jquery自定义进度条与h5原生进度条

      介绍一款自定义的进度条 <div class="box-nine"> <div class="progress"> <!--一 ...

  6. 改善用户体验,用图片的自身变化以及进度通知摆脱传统的进度条,okhttp,Canvas,Paint实现

    转载请注明出处:王亟亟的大牛之路 从最開始的白页面等待,到后来的进度条告知用户.到如今的WebBO/微信这样的先下缩略图点击才又一次下大图的方式,我们开发人员对用户感知的注意度越来越高.昨天刷微博的时 ...

  7. Java web实时进度条整个系统共用(如java上传进度条、导入excel进度条等)

    先上图: 这上文件上传的: 这是数据实时处理的: 1:先说说什么是进度条:进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务量的大小,和可能需要处理时间,显示方式 ...

  8. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  9. CProgressCtrl进度条控件实现进度滚动效果

    关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 实现这个效果的函数为SetMarquee(_In_ BOOL ...

随机推荐

  1. Play Framework Web开发教程(33): 结构化页面-组合使用模板

    和你编写代码相似,你编写的页面也能够由多个小的片段组合而成,这些小的片段本身也能够由更小的片段构成.这些小片段一般是能够在其他页面反复使用的:有些部分能够用在全部页面,而有些部分是某些页面特定的.本篇 ...

  2. Win32多线程编程(1) — 基础概念篇

      内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...

  3. C语言随记-1

    涉及指针.数组.函数指针 几种声明形式 int *a[5]; // a是一个有5个元素的数组,每个元素是整数类型指针(int *) int *a[] = {0x100, 0x104, 0x108, 0 ...

  4. nignx日志格式

    web-master的nginx格式: log_format web_format '$remote_addr $remote_port $remote_user [$time_local] ' '& ...

  5. Key lock 的秘密

    研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了: Exec sp_lock:   就说上面的key ...

  6. iOS开发-清理缓存功能的实现

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  7. 给一组a标签当前页a标签加class

    <script type="text/javascript"> $(document).ready(function(){ $(".links .topbg_ ...

  8. MAC中通过gem命令安装compass

    在MAC中通过gem命令安装compass时会出异常,原因是compass版本更新了,一些运行时所用到的依赖软件的版本没能得到更新,故而出现错误.例如,用以下命令安装compass: $ gem in ...

  9. Max Min

    def main(): n = int(raw_input()) k = int(raw_input()) k_arr = [] min_dif = 9999999999 # 根据input要求,规定 ...

  10. Hadoop学习笔记-HDFS命令

    进入 $HADOOP/bin 一.文件操作 文件操作 类似于正常的linux操作前面加上“hdfs dfs -” 前缀也可以写成hadoop而不用hdfs,但终端中显示 Use of this scr ...