天天看點

自定義ProgressBar樣式

轉載注明出處: http://blog.csdn.net/forwardyzk/article/details/42609491

我們使用的進度條多種多樣,下面有幾種自定義的進度條的樣式,下面介紹幾個.

進度條的有基本的四種樣式:

預設風格的進度條: android:progressBarStyle

水準長型進度條: android:progressBarStyleHorizontal

大圓形進度條: android:progressBarStyleLarge

小圓形進度條: android:progressBarStyleSmall

下面以橫向進度樣式作為例子,介紹自定義樣式.

思路:

1.自定義進度條的樣式.

2.設定樣式背景,進度條樣式,進度條背景.

例如:自定義顔色背景樣式

<style name="progressBarHorizontal_indeter" parent="android:Widget.ProgressBar.Horizontal">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal</item>
        <item name="android:minHeight">5dip</item>
        <item name="android:maxHeight">5dip</item>
    </style>
           

設定不确定的進度背景

progress_color_horizontal.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />

            <gradient
                android:angle="270"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:startColor="#ff9d9e9d" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />

                <gradient
                    android:angle="270"
                    android:centerColor="#80C07AB8"
                    android:centerY="0.75"
                    android:endColor="#a0C07AB8"
                    android:startColor="#80C07AB8" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />

                <gradient
                    android:angle="270"
                    android:centerColor="#ffBBFFBB"
                    android:centerY="0.75"
                    android:endColor="#ff00DB00"
                    android:startColor="#ff00DB00" />
            </shape>
        </clip>
    </item>

</layer-list
           

這是自定義圓形背景,和北京顔色,當然也可以使用存在的圖檔作為背景,設定的有進度條的背景,進度條的進度背景,和第二次進度背景圖檔.

下面介紹一個使用背景圖檔作為背景樣式的例子.

styles.xml

<style name="progressBarHorizontal" parent="android:Widget.ProgressBar.Horizontal">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@drawable/progress_horizontal</item>
        <item name="android:minHeight">5dip</item>
        <item name="android:maxHeight">5dip</item>
    </style>
           

progress_horizontal.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/progressbar_back">
    </item>
    <item
        android:id="@android:id/secondaryProgress"
        android:drawable="@drawable/progressbar_indeter2">
    </item>
    <item
        android:id="@android:id/progress"
        android:drawable="@drawable/progressbar_indeter1">
    </item>

</layer-list>
           

使用圖檔作為進度條的背景,進度背景.

使用步驟:

在布局檔案中直接加載樣式.

<ProgressBar
        android:id="@+id/progress_indeter"
        style="@style/progressBarHorizontal_indeter"
        android:layout_width="200dip"
        android:layout_height="10dip"
        android:layout_margin="10dp"
        android:indeterminate="true"
        android:max="100"
        android:progress="41" />
           

在調用出擷取此對象,然後可以其進度,通過線程.

activity_main.xml

<LinearLayout 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:gravity="center"
    android:orientation="vertical"
    tools:context="com.example.progressbardemo.MainActivity" >

    <Button
        android:id="@+id/start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="start"
        android:textSize="30sp" />

    <TextView
        android:id="@+id/tv_pb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="0%"
        android:textSize="25sp" />

    <ProgressBar
        android:id="@+id/progress_color"
        style="@style/progressBarHorizontal_color"
        android:layout_width="200dip"
        android:layout_height="10dip"
        android:layout_margin="10dp"
        android:indeterminate="true"
        android:max="100"
        android:progress="41" />


    <ProgressBar
        android:id="@+id/progress_indeter"
        style="@style/progressBarHorizontal_indeter"
        android:layout_width="200dip"
        android:layout_height="10dip"
        android:layout_margin="10dp"
        android:indeterminate="true"
        android:max="100"
        android:progress="41" />

    <ProgressBar
        android:id="@+id/progress_horizontal"
        style="@style/progressBarHorizontal"
        android:layout_width="200dip"
        android:layout_height="10dip"
        android:layout_margin="10dp"
        android:indeterminate="true"
        android:max="100"
        android:progress="41" />

    <ProgressBar
        android:id="@+id/progress_arabia"
        style="@style/progressBarHorizontal_arabia"
        android:layout_width="200dip"
        android:layout_height="10dip"
        android:layout_margin="10dp"
        android:indeterminate="true"
        android:max="100"
        android:progress="41" />

</LinearLayout>
           

MainActivity.java

public class MainActivity extends Activity {
	private final String TAG = MainActivity.class.getSimpleName();
	/**
	 * 進度條
	 */
	private ProgressBar mColor = null;
	private ProgressBar mIndeter = null;
	private ProgressBar mHorizontal = null;
	private ProgressBar mArabia = null;

	/**
	 * 目前進度的值
	 */
	private int mCount = 0;
	private int mDis = 100;
	private TextView tv_pb;// 數字進行顯示

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.start).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				showIndeterDialog();
			}
		});
		tv_pb = (TextView) findViewById(R.id.tv_pb);
		initProgressBarView();
	}

	public void initProgressBarView() {
		mColor = (ProgressBar) findViewById(R.id.progress_color);
		mIndeter = (ProgressBar) findViewById(R.id.progress_indeter);
		mHorizontal = (ProgressBar) findViewById(R.id.progress_horizontal);
		mArabia = (ProgressBar) findViewById(R.id.progress_arabia);
		initProgressBarData(mColor);
		initProgressBarData(mIndeter);
		initProgressBarData(mHorizontal);
		initProgressBarData(mArabia);
	}

	public void initProgressBarData(ProgressBar bar) {
		bar.setMax(101);
		bar.setProgress(0);
		if (bar == mArabia) {
			bar.setProgress(101);
		}
		bar.setIndeterminate(false);
	}

	private void showIndeterDialog() {
		mCount = 0;
		mDis = 100;
		new Thread() {
			public void run() {

				while (mCount <= 100 && mDis > 0) {
					mColor.setProgress(mCount);
					mIndeter.setProgress(mCount);
					mHorizontal.setProgress(mCount);
					mArabia.setProgress(mDis);
					mCount++;
					mDis--;
					handle.sendEmptyMessage(0);
					SystemClock.sleep(100);

				}

			};
		}.start();
	}

	private Handler handle = new Handler() {
		public void handleMessage(android.os.Message msg) {
			DecimalFormat format = new DecimalFormat("0.00");
			tv_pb.setText(String.valueOf(format.format(1.0
					* mColor.getProgress() / mColor.getMax() * 100.0))
					+ "%");
		};
	};
}
           

橫向的進度條設定最大值,和目前的進度,如果是從0~最大值,那麼就是從左到右顯示進度.

如果是從最大值~0,那麼就是從又到左顯示進度.

源碼下載下傳: http://download.csdn.net/detail/forwardyzk/8349889

效果圖:

自定義ProgressBar樣式