Android实现弹窗进度条效果

时间:2022-06-01 23:15:12

Android自定义进度条主要是修改ProgressBar的style,弹窗则是在Dialog里显示ProgressBar。

直接上代码。

在style.xml里加入如下代码:

?
1
2
3
4
5
6
7
<style name="ProgressBar_Mini" parent="@android:style/Widget.ProgressBar.Horizontal">
  <item name="android:maxHeight">50dip</item>
  <item name="android:minHeight">8dip</item>
  <item name="android:indeterminateOnly">false</item>
  <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
  <item name="android:progressDrawable">@drawable/progressbar_mini</item>
</style>
?
1
2
3
4
5
6
7
8
<style name="dialog" parent="@android:style/Theme.Dialog">
  <item name="android:windowFrame">@null</item>
  <item name="android:windowIsFloating">true</item>
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowNoTitle">true</item>
  <item name="android:backgroundDimEnabled">true</item>
  <item name="android:windowBackground">@color/transparent</item>
 </style>

新建drawable/progressbar_mini.xml内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
 <item android:id="@android:id/background">
  <shape>
   <corners android:radius="0dip" />
   <gradient
    android:angle="270"
    android:centerY="0.75"
    android:endColor="#F5F5F5"
    android:startColor="#BEBEBE" />
  </shape>
 </item>
 
 <item android:id="@android:id/secondaryProgress">
  <clip>
   <shape>
    <corners android:radius="0dip" />
    <gradient
     android:angle="270"
     android:centerY="0.75"
     android:endColor="#165CBC"
     android:startColor="#85B0E9" />
   </shape>
  </clip>
 </item>
 
 <item android:id="@android:id/progress">
  <clip>
   <shape>
    <corners android:radius="0dip" />
    <gradient
     android:angle="270"
     android:centerY="0.75"
     android:endColor="#00FF66"
     android:startColor="#00FF66" />
   </shape>
  </clip>
 </item>
</layer-list>

myprogressbar.xml的内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/back_qian"
 android:gravity="center"
 android:orientation="vertical" >
 
 <TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:text="正在切换状态...."
  android:textSize="18sp"
  android:textColor="@color/black" />
 
 <TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:text="" />
 
<ProgressBar
 android:id="@+id/progressBar1"
 style="@style/ProgressBar_Mini"
 android:layout_width="290dp"
 android:layout_height="17dp" />
  
</LinearLayout>

MyProgressBar.java的内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.wl.util;
 
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
 
import com.wl.R;
 
public class MyProgressBar {
 Dialog dialog;
 Context context;
 // 声明ProgressBar对象
 private ProgressBar pro1;
  
 
 /**
  * 构造
  */
 public MyProgressBar(Context context) {
  // TODO Auto-generated constructor stub
  this.context = context;
  dialog = new Dialog(context, R.style.dialog);
  dialog.setOnCancelListener(onCancelListener);
 }
 
 /**
  * 初始化进度对话框
  */
 public void initDialog() {
 
  LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  View view = inflater.inflate(R.layout.myprogressbar, null);
  dialog.setContentView(view);
  pro1 = (ProgressBar) dialog.findViewById(R.id.progressBar1);
  // 设置进度条是否自动旋转,即设置其不确定模式,false表示不自动旋转
  pro1.setIndeterminate(false);
  // 设置ProgressBar的最大值
  pro1.setMax(100);
 
  // 设置ProgressBar的当前值
  pro1.setProgress(0);
 
   
  dialog.show();
 }
 
 public void setProgress(int progressValue) {
  pro1.setProgress(progressValue);
 }
  
 public void colseDialog() {
  dialog.dismiss();
 }
 
 public boolean isShowing() {
  if (dialog.isShowing()) {
   return true;
  } else {
   return false;
  }
 }
 
 OnCancelListener onCancelListener = new OnCancelListener() {
  @Override
  public void onCancel(DialogInterface dialog) {
   // TODO Auto-generated method stub
   dialog.dismiss();
  }
 };
}

调用代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
MyProgressBar myProgressBar;
myProgressBar = new MyProgressBar(Dialog_TestActivity.this);
myProgressBar.initDialog();
    new Thread(new Runnable() {
     @Override
     public void run() {
      // TODO Auto-generated method stub
 
 
      try {
       Thread.sleep(200);
      } catch (InterruptedException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      for (int i = 0; i < 100; i++) {
       handler.sendEmptyMessage(0);
       try {
        Thread.sleep(30);
       } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
     }
    }).start();
Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   // 改变ProgressBar的当前值
   myProgressBar.setProgress(intCounter++);
   if (intCounter == 100) {
    intCounter = 0;
    myProgressBar.colseDialog();
   }
  
 };

按返回退出:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
 public void onBackPressed() {
  // TODO Auto-generated method stub
  Log.d("11", "onBackPressed()");
 
  if (myProgressDialog.isShowing()) {
   myProgressDialog.colseDialog();
  }
  if (myProgressBar.isShowing()) {
   myProgressBar.colseDialog();
  }
 
  super.onBackPressed();
 }

源码:Android实现弹窗进度条

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/viviwen123/article/details/8717256