Android进度条ProgressBar使用详解

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

布局中设置:

<pre name="code" class="html">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>
4、可以看到,上面文件中的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>
5、在布局文件中设置自定义背景增加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();
	}
}
源码下载
发布了99 篇原创文章 · 获赞 15 · 访问量 20万+
展开阅读全文

Android 这种进度条怎么实现?

12-10

遇到一个这样的进度条,跟随进度变化,高亮发光。颜色跟随主题颜色变化,所以不能用固定颜色图片之类的 ![图片说明](https://img-ask.csdn.net/upload/201812/10/1544413021_963969.png) 尝试了一下,通过<layer-list>加一层渐变,效果感人 ``` <?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:height="@dimen/dp_2px"> <shape> <corners android:radius="@dimen/dp_1px" /> <solid android:color="@color/gray" /> </shape> </item> <item android:id="@android:id/progress" android:height="@dimen/dp_5px" android:gravity="center"> <clip> <layer-list> <item> <shape> <corners android:radius="@dimen/dp_2px" /> <gradient android:angle="0" android:endColor="?attr/theme_color" android:startColor="@android:color/transparent" android:type="linear" /> </shape> </item> <item android:bottom="@dimen/dp_2px" android:gravity="center" android:top="@dimen/dp_2px"> <shape> <corners android:radius="@dimen/dp_2px" /> <solid android:color="?attr/theme_color" /> </shape> </item> </layer-list> </clip> </item> </layer-list> ``` ![图片说明](https://img-ask.csdn.net/upload/201812/10/1544419919_212512.png) 使用 elevation也没有效果 ``` android:elevation="@dimen/dp_20px" android:outlineProvider="bounds" android:translationZ="@dimen/dp_20px" ``` 一时间不知道该如果去实现,哪位大神帮忙下 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览