Android进度条ProgressBar使用详解

本文详细介绍Android中ProgressBar的使用方法,包括基本属性设置、Java代码控制及自定义样式。通过实例展示了不同类型的进度条及其交互操作。

先介绍一下ProgressBar几种比较常用的属性

布局中设置:

android:max="100" ——最大显示进度
android:progress="50"——第一显示进度
android:secondaryProgress="80"——第二显示进度
android:indeterminate="true"——设置是否精确显示,true表示不精确显示进度,false表示精确显示进度

使用Java代码设置:

setProgress(int) //设置第一进度
setSecondaryProgress(int) //设置第二进度
getProgress() //获取第一进度
getSecondaryProgress() //获取第二进度
incrementProgressBy(int) //增加或减少第一进度
incrementSecondaryProgressBy(int) //增加或减少第二进度
getMax() //获取最大进度

        对普通进度条和提示框进度条就不详细说明了,后面有一个例子,会有几种进度条的使用方法,在代码中有详细的注释。这里介绍一下自定义进度条的实现,以水平进度条为例。

1、在布局文件中的style属性就是设置进度条样式的

<ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

2、实际上面的背景文件是位于@android:style/Widget.ProgressBar.Horizontal,既上面的布局可以写成

<ProgressBar
        android:id="@+id/progressBar1""
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

3、查看系统中的水平进度条风格文件

<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>
</style>

4、上面的android:progressDrawable属性是设置进度条背景,进入查看

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
            />
        </shape>
    </item>
    
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>
    
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>
    
</layer-list>

5、可以看到,上面文件中的3个item标签分别是设置:进度条、第二进度条、第一进度条的背景色。这里我们在drawable文件夹下新建一个progress_bar.xml文件,将上面的代码复制进来,并修改背景色。注意:最外层标签是否一致,我在复制时只复制了3个item,结果总是报错,找了半天才找到原因。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 进度条背景色 -->
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
            />
        </shape>
    </item>
    
    <!-- 第二进度条 -->
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#b9a4ff"
                        android:centerColor="#c6b7ff"
                        android:centerY="0.75"
                        android:endColor="#c3b2ff"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>
    
    <!-- 第二进度条 -->
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#57e8ff"
                        android:centerColor="#74ebff"
                        android:centerY="0.75"
                        android:endColor="#8eefff"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>
</layer-list>

6、在布局文件中设置自定义背景增加android:progressDrawable="@drawable/progress_bar"属性设置

<ProgressBar
        android:id="@+id/progressBar1"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:progressDrawable="@drawable/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

        上面的自定义进度条只是修改了一下背景颜色,如果同时修改其他属性,还可以将进度条风格也在自己的style.xml文件中重新定义使用。

        下面是一个完整的进度条使用代码,注释比较详细,自定义进度条直接使用上面的progress_bar的设置。
1、布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

    <ProgressBar
        android:id="@+id/progressBar2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/progressBar1" />

    <ProgressBar
        android:id="@+id/progressBar3"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/progressBar2" />

    <ProgressBar
        android:id="@+id/progressBar4"
        android:max="100"
        android:progress="50"
        android:secondaryProgress="80"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/progressBar3" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/progressBar4"
        android:text="增加" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar4"
        android:layout_toRightOf="@+id/progressBar1"
        android:text="减少" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_toRightOf="@+id/button2"
        android:text="重置" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/button1"
        android:text="TextView" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:text="对话框进度条" />
    
    <ProgressBar
        android:id="@+id/progressBar5"
        android:max="100"
        android:progress="50"
        android:secondaryProgress="80"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:progressDrawable="@drawable/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/button4" />
    
</RelativeLayout>

2、Java代码中进度条功能实现

package com.cx.testdemo;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements android.view.View.OnClickListener{
	private ProgressBar progress;
	private Button button1;
	private Button button2;
	private Button button3;
	private Button button4;
	private TextView textView;
	private ProgressDialog progressDialog;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//启用窗口特征,启用带进度和不带进度的进度条
		requestWindowFeature(Window.FEATURE_PROGRESS);
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.activity_main);

		//显示两种进度条
		setProgressBarVisibility(true);
		setProgressBarIndeterminateVisibility(true);
		
		//设置带进度条刻度,最大值为10000
		setProgress(600);
		
		findView();
	}

	private void findView() {
		// TODO Auto-generated method stub
		progress = (ProgressBar) findViewById(R.id.progressBar4);
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		button3 = (Button) findViewById(R.id.button3);
		button4 = (Button) findViewById(R.id.button4);
		textView = (TextView) findViewById(R.id.textView1);
		
		init();
		
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
		button3.setOnClickListener(this);
		button4.setOnClickListener(this);
	}

	private void init() {
		//获取第一进度条进度
		int first = progress.getProgress();
		//获取第二进度条进度
		int second = progress.getSecondaryProgress();
		//获取进度条最大进度
		int max = progress.getMax();
		
		textView.setText("第一进度百分比:" + (int)(first/(float)max*100) + "% 第二进度百分比:" + (int)(second/(float)max*100));
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.button1:
			//增加第一进度和第二进度10刻度
			progress.incrementProgressBy(10);
			progress.incrementSecondaryProgressBy(10);
			break;

		case R.id.button2:
			//减少第一进度和第二进度10刻度
			progress.incrementProgressBy(-10);
			progress.incrementSecondaryProgressBy(-10);
			break;
			
		case R.id.button3:
			progress.setProgress(50);
			progress.setSecondaryProgress(80);
			break;
			
		case R.id.button4:
			/**
			 * 页面显示风格
			 */
			//新建ProgressDialog对象
			progressDialog = new ProgressDialog(MainActivity.this);
			//设置显示风格
			progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			//设置标题
			progressDialog.setTitle("提示");
			//设置对话框内信息
			progressDialog.setMessage("当前进度");
			//设置图标
			progressDialog.setIcon(R.drawable.ic_launcher);
			/**
			 * 页面ProgressDialog的一些属性
			 */
			//设置最大进度
			progressDialog.setMax(100);
			//设置初始化已经增长到的进度
			progressDialog.incrementProgressBy(50);
			//进度条是精确显示进度的
			progressDialog.setIndeterminate(false);
			//确定按钮(按钮类型,显示内容,点击事件)
			progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
					Toast.makeText(MainActivity.this, "点击了确定按钮", Toast.LENGTH_SHORT).show();
				}
			});
			//是否可以通过返回按钮退出对话框
			progressDialog.setCancelable(true);
			//显示ProgressDialog
			progressDialog.show();
			break;
		}
		init();
	}
}

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c小旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值