Android實用筆記——使用ProgressBar實現進度條

一、ProgressBar的分類java

    能夠精確顯示進度(能夠顯示刻度或者精確百分比)android

    不能夠精確顯示精度(一直轉,相似於一個過場動畫)app

 

二、關鍵屬性和方法ide

    指定ProgressBar顯示風格函數

        style="?android:attr/progressBarStyleLarge"    大環形進度條佈局

        style="?android:attr/progressBarStyleSmall"    小環形進度條動畫

        style="?android:attr/progressBarStyleHorizontal"    水平進度條this

    ProgressBar的關鍵屬性code

        android:max="100"    最大顯示進度xml

        android:progress="50"    第一顯示進度

        android:secondaryProgress="80"    第二顯示進度

        android:indenterminate="true"    設置是否精確顯示(true表示不精確顯示進度,false表示精確顯示進度)

    ProgressBar的關鍵方法

        setProgress(int)    設置第一進度

        setSecondaryProgress(int)    設置第二進度

        setProgress()    獲取第一進度

        getSecondaryProgress()    獲取第二進度

        incrementProgressBy(int)    增長或減小第一進度

        incrementSecondaryProgressBy(int)    增長或減小第二進度

        getMax()    獲取最大進度

 

三、標題欄中的ProgressBar

package com.example.myandroidprogressbar;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;

public class MainActivity extends Activity {

    @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);
        //Max=10000
        setProgress(600);
    }
}

    

四、界面中四種不一樣形式的進度條

    修改activity_main.xml文件以下

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <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_alignBottom="@+id/progressBar1"
        android:layout_toRightOf="@+id/progressBar1" />
    
    <ProgressBar
        android:id="@+id/progressBar3"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/horiz"
        android:layout_toRightOf="@+id/progressBar2" />

    <ProgressBar
        android:id="@+id/horiz"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/progressBar1"
        android:layout_below="@+id/progressBar1"
        android:max="100"
        android:progress="50"
        android:secondaryProgress="80" />
      
</RelativeLayout>

 

五、經過按鈕改變進度條的數值並動態改變

    修改activity_main.xml文件

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ProgressBar
        android:id="@+id/horiz"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="50"
        android:secondaryProgress="80" />
    
    <Button
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/horiz"
        android:layout_below="@+id/horiz"
        android:text="@string/add" />

    <Button
        android:id="@+id/reduce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/add"
        android:layout_below="@+id/add"
        android:text="@string/reduce" />

    <Button
        android:id="@+id/reset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/reduce"
        android:layout_below="@+id/reduce"
        android:text="@string/reset" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/reset"
        android:layout_alignRight="@+id/horiz"
        android:layout_below="@+id/reset"
        android:layout_marginTop="16dp" />


</RelativeLayout>

    修改MainActivity.java文件

package com.example.myandroidprogressbar;

import android.os.Bundle;
import android.R.integer;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
	//一、聲明部分控件
	private ProgressBar progress;
	private Button add;
	private Button reduce;
	private Button reset;
	private TextView text;	
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        
        setContentView(R.layout.activity_main);

        //二、初始化控件
        init();
    }

	private void init() {
		// TODO Auto-generated method stub
		//三、綁定
		progress=(ProgressBar) findViewById(R.id.horiz);
		add=(Button) findViewById(R.id.add);
		reduce=(Button) findViewById(R.id.reduce);
		reset=(Button) findViewById(R.id.reset);
		text=(TextView) findViewById(R.id.text);
		
		//四、獲取各進度條進度
		//獲取第一進度條的進度
		//int first=progress.getProgress();
		//湖區第二進度條的進度
		//int second=progress.getSecondaryProgress();
		//獲取進度條的最大進度
		//int max=progress.getMax();
		//五、將數據顯示到textView中
		//text.setText("第一進度的百分比:"+(int)(first/(float)max*100)+
				//"% 第二進度的百分比:"+(int)(second/(float)max*100)+"%");
		add.setOnClickListener(this);
		reduce.setOnClickListener(this);
		reset.setOnClickListener(this);
	}

	//六、設置按鈕點擊響應事件,改變進度條數據
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.add:
			//增長第一進度和第二進度10個刻度
			progress.incrementProgressBy(10);
			progress.incrementSecondaryProgressBy(10);
			break;
			
		case R.id.reduce:
			//減小第一進度和第二進度10個刻度
			progress.incrementProgressBy(-10);
			progress.incrementSecondaryProgressBy(-10);
			break;
			
		case R.id.reset:
			//重置
			progress.setProgress(50);
			progress.setSecondaryProgress(80);		
			break;
			
		}
		//七、由於每一次點擊都會調用onClick這個函數,而且必定會執行switch這個判斷。
		//因此不必在每個分支中刷新textView的內容,只須要在switch分支外面寫就行了,
		//以前的向textView中寫入數據的應該註釋掉
		text.setText("第一進度的百分比:"+(int)(progress.getProgress()/(float)progress.getMax()*100)+
				"% 第二進度的百分比:"+(int)(progress.getSecondaryProgress()/(float)progress.getMax()*100)+"%");
	}
}

 

六、對話框形式的進度條(ProgressDialog)

    修改activity_main.xml文件

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="86dp"
        android:text="顯示進度條對話框" />

</RelativeLayout>

    修改MainActivity.java文件

package com.example.myandroidprogressdialog;

import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
	//一、聲明progressDialog的對象以及按鈕
	private ProgressDialog prodialog;
	private Button show;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        init();
    }

	private void init() {
		// TODO Auto-generated method stub
		//二、綁定
		show=(Button) findViewById(R.id.show);
		//三、設置監聽器
		show.setOnClickListener(this);
	}

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		//四、設置頁面顯示風格
		//新建progressDialog對象
		prodialog=new ProgressDialog(MainActivity.this);
		//給對話框設置顯示風格
		prodialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		//設置標題
		prodialog.setTitle("哈哈哈");
		//設置對話框裏的而文字信息
		prodialog.setMessage("我好聰明啊");
		//設置圖標
		prodialog.setIcon(R.drawable.ic_launcher);
		
		//五、設定關於progressBar的一些屬性
		//設定最大進度
		prodialog.setMax(100);
		//設定初始化進度
		prodialog.incrementProgressBy(50);
		//進度條是明確顯示進度的
		prodialog.setIndeterminate(false);
		
		//六、設定一個肯定按鈕
		prodialog.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);
			}
		});
		
		//七、是否能夠經過返回按鈕退出對話框
		prodialog.setCancelable(true);
		
		//八、顯示progressDialog
		prodialog.show();
	}
    
}

 

七、自定義ProgressBar的樣式

    首先咱們須要知道系統預約義的水平進度條的樣式是如何加載的。這樣咱們須要回到activity_main.xml文件中來。

    咱們注意到下面一行代碼:

style="?android:attr/progressBarStyleHorizontal"

    事實上,他真正的加載文件位於

style="@android:style/Widget.ProgressBar.Horizontal"

    咱們經過ctrl+鼠標左鍵點擊引號中的位置,就能夠看到系統自帶的橫向進度條的樣式

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

    其中的android:progressDrawable能夠去加載一個本身自定義的佈局樣式的一個文件。咱們一樣用ctrl+鼠標左鍵打開這裏的樣式文件,看看系統是如何設定的

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

    不難發現,咱們能夠本身對他的顏色進行修改,以達到自定義的目的。這裏我簡單把顏色修改了一下

<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="#B9A4FF"
                    <!--中間顏色  -->
                    android:centerColor="#C6B7FF"
                    android:centerY="0.75"
                    <!--終止顏色  -->
                    android:endColor="#C3B2FF"
                    android:angle="270"
            />
        </shape>
    </item>
    
    <!--第二進度條  -->
    <item android:id="@android:id/secondaryProgress">
        <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>
    
    <!--第一進度條  -->
    <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>

    運行便可獲得自定義進度條的結果,可自行與本文以前的截圖對比,能夠看到很明顯的差異,儘管顏色醜了點。

    但願你們能以小見大,作一些更有意思的嘗試。

相關文章
相關標籤/搜索