android基础知识4-3.7progressbar(进度条)详解

author author     2023-03-17     611

关键词:


一、简介

        ProgressBar(进度条)是UI界面中一种非常实用的组件,通常用于向用户像是某个耗时操作完成的百分比。进度条可动态地显示进度,因此避免长时间地执行某个操作时,让用户感觉程序失去了响应,从而更好地提高用户界面的友好性。也是为数不多的直接继承于View类的控件,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar。

        Android系统提供了两大类进度条样式,长形进度条(progressBarStyleHorizontal)和圆形进度条(progressBarStyleLarge)如图所示:几乎所有的花样的进度条都主要为这两种类型。

Android

 二、常用属性和方法

属性名

含义

style

设置进度条的风格

max

设置该进度条的最大值

maxHeight

进度Widget最大高

miniHeight

进度Widget最小高

maxWidth

进度Widget最大宽

minWidth

进度Widget最小宽

progress

设置该进度条的已完成进度值

progressDrawable

自定义drawable显示

indeteminateDrawable

设置绘制不显示进度的进度条的Drawable对象

indeterminate

该属性设为true,设置进度条不精确显示进度

indeteminateDuration

设置不精确显示进度的持续时间

secondaryProgress

定义二级进度值,值介于0到max。该进度在主进度和背景之间。比如用于网络播放视频时,二级进度用于表示缓冲进度,主进度用于表示播放进度。

interpolator

设置动画速度

indeterminateBehavior

定义当进度达到最大时,不确定模式的表现;该值必须为repeat或者cycle,repeat表示进度从0重新开始;cycle表示进度保持当前值,并且回到0

2.1、style属性:

  • @android:style/Widget.ProgressBar.Horizontal:水平进度条
  • @android:style/Widget.ProgressBar.Inverse:普通大小的进度条
  • @android:style/Widget.ProgressBar.Large:大环形进度条
  • @android:style/Widget.ProgressBar.Large.Inverse:大环形进度条
  • @android:style/Widget.ProgressBar.Small:小环形进度条
  • @android:style/Widget.ProgressBar.Small.Inverse:小环形进度条

2.2、常用属性详解:

  • android:max:进度条的最大值
  • android:progress:进度条已完成进度值
  • android:progressDrawable:设置轨道对应的Drawable对象
  • android:indeterminate:如果设置成true,则进度条不精确显示进度
  • android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象
  • android:indeterminateDuration:设置不精确显示进度的持续时间
  • android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!

对应的再Java中我们可调用下述方法:

  • getMax():返回这个进度条的范围的上限
  • getProgress():返回进度
  • getSecondaryProgress():返回次要进度
  • incrementProgressBy(int diff):指定增加的进度
  • isIndeterminate():指示进度条是否在不确定模式下
  • setIndeterminate(boolean indeterminate):设置不确定模式下

三、进度条使用实例

3.1、效果图:

Android

3.2、XML:


<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_ android:layout_ android:orientation="vertical" tools:context=".MainActivity"> <!-- 系统提供的圆形进度条,依次是大中小 --> <ProgressBar style="@android:style/Widget.ProgressBar.Small" android:layout_ android:layout_ /> <ProgressBar android:layout_ android:layout_ /> <ProgressBar style="@android:style/Widget.ProgressBar.Large" android:layout_ android:layout_ /> <!--系统提供的水平进度条--> <ProgressBar style="@android:style/Widget.ProgressBar.Horizontal" android:layout_ android:layout_ android:max="100" android:progress="18" /> <ProgressBar style="@android:style/Widget.ProgressBar.Horizontal" android:layout_ android:layout_ android:layout_marginTop="10dp" android:indeterminate="true" /> </LinearLayout>


四、使用动画来替代圆形进度条

        第一个方案是,使用一套连续图片,形成一个帧动画,当需要进度图的时候,让动画可见,不需要 的时候让动画不可见即可!而这个动画,一般是使用AnimationDrawable来实现的!接下来,我们来定义一个AnimationDrawable文件:

效果图:

Android

(1)、在res目录下新建一个anim文件,然后创建amin_pgbar.xml的资源文件:


<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >

<item
android:drawable="@drawable/loading_01"
android:duration="200"/>
<item
android:drawable="@drawable/loading_02"
android:duration="200"/>
<item
android:drawable="@drawable/loading_03"
android:duration="200"/>
<item
android:drawable="@drawable/loading_04"
android:duration="200"/>
<item
android:drawable="@drawable/loading_05"
android:duration="200"/>
<item
android:drawable="@drawable/loading_06"
android:duration="200"/>
<item
android:drawable="@drawable/loading_07"
android:duration="200"/>
<item
android:drawable="@drawable/loading_08"
android:duration="200"/>
<item
android:drawable="@drawable/loading_09"
android:duration="200"/>
<item
android:drawable="@drawable/loading_10"
android:duration="200"/>
<item
android:drawable="@drawable/loading_11"
android:duration="200"/>
<item
android:drawable="@drawable/loading_12"
android:duration="200"/>

</animation-list>


(2)、接着写个布局文件,里面仅仅有一个ImageView即可,用于显示进度条,把src设置为上述drawable资源(R.amin.amin_pgbar)即可! 最后到MainActivity.java


public class MainActivity extends AppCompatActivity 

private ImageView img_pgbar;
private AnimationDrawable ad;

@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_pgbar = (ImageView) findViewById(R.id.img_pgbar);
ad = (AnimationDrawable) img_pgbar.getDrawable();
img_pgbar.postDelayed(new Runnable()
@Override
public void run()
ad.start();

, 100);



        这里只是写了如何启动动画,剩下的就你自己来了吧。在需要显示进度条的时候,让ImageView可见; 在不需要的时候让它隐藏即可。另外其实Progressbar本身有一个indeterminateDrawable,只需把 这个参数设置成上述的动画资源即可,但是进度条条的图案大小是不能直接修改的,需要Java代码中 修改,如果你设置了宽高,而且这个宽高过大的时候,你会看到有多个进度条...

五、自定义圆形进度条

效果图:

Android

实现代码:

自定义View类:


/**
* Created by Jay on 2015/8/5 0005.
*/
public class CirclePgBar extends View


private Paint mBackPaint;
private Paint mFrontPaint;
private Paint mTextPaint;
private float mStrokeWidth = 50;
private float mHalfStrokeWidth = mStrokeWidth / 2;
private float mRadius = 200;
private RectF mRect;
private int mProgress = 0;
//目标值,想改多少就改多少
private int mTargetProgress = 90;
private int mMax = 100;
private int mWidth;
private int mHeight;


public CirclePgBar(Context context)
super(context);
init();


public CirclePgBar(Context context, AttributeSet attrs)
super(context, attrs);
init();


public CirclePgBar(Context context, AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);
init();



//完成相关参数初始化
private void init()
mBackPaint = new Paint();
mBackPaint.setColor(Color.WHITE);
mBackPaint.setAntiAlias(true);
mBackPaint.setStyle(Paint.Style.STROKE);
mBackPaint.setStrokeWidth(mStrokeWidth);

mFrontPaint = new Paint();
mFrontPaint.setColor(Color.GREEN);
mFrontPaint.setAntiAlias(true);
mFrontPaint.setStyle(Paint.Style.STROKE);
mFrontPaint.setStrokeWidth(mStrokeWidth);


mTextPaint = new Paint();
mTextPaint.setColor(Color.GREEN);
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(80);
mTextPaint.setTextAlign(Paint.Align.CENTER);



//重写测量大小的onMeasure方法和绘制View的核心方法onDraw()
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getRealSize(widthMeasureSpec);
mHeight = getRealSize(heightMeasureSpec);
setMeasuredDimension(mWidth, mHeight);




@Override
protected void onDraw(Canvas canvas)
initRect();
float angle = mProgress / (float) mMax * 360;
canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius, mBackPaint);
canvas.drawArc(mRect, -90, angle, false, mFrontPaint);
canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
if (mProgress < mTargetProgress)
mProgress += 1;
invalidate();




public int getRealSize(int measureSpec)
int result = 1;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);

if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED)
//自己计算
result = (int) (mRadius * 2 + mStrokeWidth);
else
result = size;


return result;


private void initRect()
if (mRect == null)
mRect = new RectF();
int viewSize = (int) (mRadius * 2);
int left = (mWidth - viewSize) / 2;
int top = (mHeight - viewSize) / 2;
int right = left + viewSize;
int bottom = top + viewSize;
mRect.set(left, top, right, bottom);




然后在布局文件中加上:


<com.jay.progressbardemo.CirclePgBar
android:layout_
android:layout_/>

自定义圆形进度条就是这样简单。

六、本章小结

        本节给大家介绍了Android中的常用控件:ProgressBar的基本用法,以及实际开发中对于进度条的两种实现方法,第一种是系统自带的效果,第二个自定义进度条可以自行完善,然后用到实际开发中......

如何在 Android 中制作“忙碌”动画?

...答案中描述的进度对话框,您还可以:在您的活动中添加ProgressB 查看详情

android面试题总结之android基础(代码片段)

...础ContentProvider(二)我们讲的ContentProvider和Intent基础知识。本节主要讲解BroadcastReceiver相关基础知识。在阅读过程中有任何问题,请及时联系 查看详情

android面试题总结之android基础(代码片段)

...础ContentProvider(二)我们讲的ContentProvider和Intent基础知识。本节主要讲解BroadcastReceiver相关基础知识。在阅读过程中有任何问题,请及时联系 查看详情

android面试题总结之android基础(代码片段)

...roid基础BroadcastReceiver(三)我们讲了BroadcastReceiver基础知识。本节主要讲解Service相关基础知识,Service也是我们开发过程中经常使用到。在阅读过程中有任何问题, 查看详情

android音频开发:音频基础知识(代码片段)

一、Android音频开发(一):音频基础知识二、Android音频开发(二):录制音频(WAV及MP3格式)三、Android音频开发(三):使用ExoPlayer播放音频四、Android音频开发(四):音频播放模式五、Android音频开发(五):感应(息屏/亮... 查看详情

android面试题java基础

Android面试题(一)Java基础Android面试题(二)Android基础Android面试题(三)Java虚拟机Android面试题(四)设计模式Android面试题(五)数据结构/算法Android面试题(六)网络基础 查看详情

android学习指南—android基础知识汇总(代码片段)

...习指南系列将分为三个模块第一Java知识点汇总第二Android基础知识点汇总(一)(二)第三Android进阶知识点汇总后续的NDK、跨平台、底层源码等技术,也会抽空给大家整理一下知识点,如果喜欢的话,... 查看详情

android面试题网络基础

Android面试题(一)Java基础Android面试题(二)Android基础Android面试题(三)Java虚拟机Android面试题(四)设计模式Android面试题(五)数据结构/算法Android面试题(六)网络基础写出OSI七层模型和TCP/IP的五层模型( 查看详情

android布局需要知道的基础知识

eclipse配置环境变量:  1、在eclipse中的Window-->preferences -->Android(安装了ADT的前提下才能看到Android)-->SDKLocation:将SDK路径导入  2、将sdk目录中的platform-tools、tools配置到环境变量的Path中    &&cmd命令:ad... 查看详情

android面试题总结之android基础

...试题总结之Android基础Activity(一)我们讲的Activity基础知识。有许多朋友反映看着比较乱,我又回去看了看,确实很乱,不够细心。然后我又重新整理了一遍。让大家阅读体验更好 查看详情

android应用安全|android应用基础知识和代理抓包

Android应用安全|Android应用基础知识和代理抓包作者:1e0n免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。0x00前言由于工作需要,手里的项目有个APP应用需要测试。但在此之前&#x... 查看详情

markdown[kotlin基础知识]#android(代码片段)

查看详情

狗子的android学习笔记基础知识

Android操作系统是由安迪罗宾开发出来的,2005年被Google收购。Android系统采用分层架构(四层),从高到低分为:应用程序层、应用程序框架层、系统库与Android运行层、Linux内核层。Android应用开发技术:系... 查看详情

android基础知识课程助您轻松构建应用

...021年10月,我们发布了 "使用Kotlin构建Android应用的基础知识" 课程的最后一个单元,这是我们推出的免费自学编程课程,致力于帮助没有编程经验的人进行Android开发,构建Android应用。在此课程中,学生... 查看详情

新手刚刚开始学习android,求推荐android开发入门教程

参考技术A开发android,我们需要哪些技能基础。①Java基础知识②Linux基础知识③数据库基础知识④网络协议⑤Android基础知识⑥服务器端开发知识①Java基础知识很多朋友一上手就开始学习Android,似乎太着急了一些。Android应用程序... 查看详情

android面试题总结之android基础

Android面试题总结之Android基础(二)上一篇面试总结,主要讲了Activity和Intent,这篇主要讲剩下的四大组件,面试中基础较多的就是四大组件,需要了解的知识点也很多。上一篇文章Android面试题总结之Android... 查看详情

android面试题总结之android基础(代码片段)

...roid基础BroadcastReceiver(三)我们讲了BroadcastReceiver基础知识。本节主要讲解Service相关基础知识,Service也是我们开发过程中经常使用到。在阅读过程中有任何问题,请及时联系。如需转载请注明fuchenxuandeBlog本章系... 查看详情

在 Android 开发中使用 logcat 的基础知识

】在Android开发中使用logcat的基础知识【英文标题】:BasicsonusinglogcatinAndroiddevelopment【发布时间】:2013-08-1304:58:50【问题描述】:我刚开始使用Android,我不明白如何使用这个logcat东西。我正在开发模拟器,但将来可能也会在真实... 查看详情