標籤:android progress dialog
閑來無事,總結了兩個自訂的ProgressDialog,大家可以參考下,根據自己需要進行選擇修改:
實現效果:
樣本1:
樣本2:
代碼如下:
MainActivity:只是兩個Button點擊事件
package com.customwaitdialog;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {private Button btn_customDialog1;private Button btn_customDialog2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {btn_customDialog1 = (Button) findViewById(R.id.btn_customDialog1);btn_customDialog2 = (Button) findViewById(R.id.btn_customDialog2);btn_customDialog1.setOnClickListener(this);btn_customDialog2.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {// 樣本1case R.id.btn_customDialog1:Intent intent1 = new Intent(this, DialogActivity1.class);startActivity(intent1);break;// 樣本2case R.id.btn_customDialog2:Intent intent2 = new Intent(this, DialogActivity2.class);startActivity(intent2);break;default:break;}}}
樣本1DialogActivity1:
package com.customwaitdialog;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import com.dialogutil.CustomWaitDialog1;public class DialogActivity1 extends Activity {private MainFrameTask mMainFrameTask = null;private CustomWaitDialog1 progressDialog = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);mMainFrameTask = new MainFrameTask(this);mMainFrameTask.execute();}@Overrideprotected void onDestroy() {stopProgressDialog();if (mMainFrameTask != null && !mMainFrameTask.isCancelled()) {mMainFrameTask.cancel(true);}super.onDestroy();}private void startProgressDialog() {if (progressDialog == null) {progressDialog = CustomWaitDialog1.createDialog(this);progressDialog.setMessage("正在載入中...");}progressDialog.show();}private void stopProgressDialog() {if (progressDialog != null) {progressDialog.dismiss();progressDialog = null;}}public class MainFrameTask extends AsyncTask<Integer, String, Integer> {private DialogActivity1 mainFrame = null;public MainFrameTask(DialogActivity1 mainFrame) {this.mainFrame = mainFrame;}@Overrideprotected void onCancelled() {stopProgressDialog();super.onCancelled();}@Overrideprotected Integer doInBackground(Integer... params) {try {Thread.sleep(10 * 1000);} catch (InterruptedException e) {e.printStackTrace();}return null;}@Overrideprotected void onPreExecute() {startProgressDialog();}@Overrideprotected void onPostExecute(Integer result) {stopProgressDialog();}}}
重點來了CustomWaitDialog1:
package com.dialogutil;import android.app.Dialog;import android.content.Context;import android.graphics.drawable.AnimationDrawable;import android.view.Gravity;import android.widget.ImageView;import android.widget.TextView;import com.customwaitdialog.R;public class CustomWaitDialog1 extends Dialog {private Context context = null;private static CustomWaitDialog1 customProgressDialog = null;public CustomWaitDialog1(Context context) {super(context);this.context = context;}public CustomWaitDialog1(Context context, int theme) {super(context, theme);}public static CustomWaitDialog1 createDialog(Context context) {customProgressDialog = new CustomWaitDialog1(context,R.style.CustomProgressDialog);customProgressDialog.setCanceledOnTouchOutside(false);customProgressDialog.setContentView(R.layout.customprogressdialog);customProgressDialog.getWindow().getAttributes().gravity = Gravity.CENTER;return customProgressDialog;}public void onWindowFocusChanged(boolean hasFocus) {if (customProgressDialog == null) {return;}ImageView imageView = (ImageView) customProgressDialog.findViewById(R.id.loadingImageView);AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();animationDrawable.start();}public CustomWaitDialog1 setTitile(String strTitle){ return customProgressDialog; } public CustomWaitDialog1 setMessage(String strMessage){ TextView tvMsg = (TextView)customProgressDialog.findViewById(R.id.id_tv_loadingmsg); if (tvMsg != null){ tvMsg.setText(strMessage); } return customProgressDialog; } }
style:
<resources> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. --> <style name="AppBaseTheme" parent="android:Theme.Light"> <!-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. --> </style> <!-- Application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <item name="android:windowNoTitle">true</item> <!-- All customizations that are NOT specific to a particular API-level can go here. --> </style> <style name="common_dialog" parent="@android:style/Theme.Dialog"> <item name="android:windowIsFloating">true</item> <!-- 設定未浮動視窗 --> <item name="android:windowFrame">@null</item> <!-- 設定無邊框 --> <item name="android:windowNoTitle">true</item> <!-- 設定無標題 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 設定完全透明 --> <item name="android:backgroundDimEnabled">false</item> <!-- 設定螢幕變暗 --> </style> <style name="CustomDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> </style> <style name="CustomProgressDialog" parent="@style/CustomDialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> </style></resources>
布局customprogressdialog.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <ImageView android:id="@+id/loadingImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@anim/progress_round"/> <TextView android:id="@+id/id_tv_loadingmsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textSize="20dp"/></LinearLayout>
旋轉動畫:progress_round.xml:
<?xml version="1.0" encoding="utf-8"?><animation-listxmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/progress_1" android:duration="200"/> <item android:drawable="@drawable/progress_2" android:duration="200"/> <item android:drawable="@drawable/progress_3" android:duration="200"/> <item android:drawable="@drawable/progress_4" android:duration="200"/> <item android:drawable="@drawable/progress_5" android:duration="200"/> <item android:drawable="@drawable/progress_6" android:duration="200"/> <item android:drawable="@drawable/progress_7" android:duration="200"/> <item android:drawable="@drawable/progress_8" android:duration="200"/></animation-list>
樣本2DialogActivity2:
package com.customwaitdialog;import android.app.Activity;import android.content.DialogInterface;import android.content.DialogInterface.OnDismissListener;import android.os.Bundle;import com.dialogutil.CustomWaitDialog2;public class DialogActivity2 extends Activity {private CustomWaitDialog2 waitDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity2); waitDialog = new CustomWaitDialog2(this); waitDialog.show(); waitDialog.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { } });}}
等待Dialog:CustomWaitDialog2:
package com.dialogutil;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.view.Window;import android.view.WindowManager;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.ImageView;import com.customwaitdialog.R;public class CustomWaitDialog2 {private Context mContext;private ImageView image;private ImageView loading_pic_bigView;private Dialog waitDialog;private Animation mAnimation;public CustomWaitDialog2(Context mContext) {this.mContext = mContext;waitDialog = new Dialog(mContext, R.style.common_dialog);waitDialog.setContentView(R.layout.loading);waitDialog.setCanceledOnTouchOutside(false);/** * 設定幕布,也就是本dialog的背景層 dimAmount在0.0f和1.0f之間,0.0f完全不暗,即背景是可見的 * ,1.0f時候,背景全部變黑暗。 * * 如果要達到背景全部變暗的效果,需要設定 * dialog.getWindow().addFlags(WindowManager.LayoutParams * .FLAG_DIM_BEHIND); ,否則,背景無效果。 */Window window = waitDialog.getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.dimAmount = 0.8f;window.setAttributes(lp);window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);// waitDialog.getWindow().getAttributes().gravity = Gravity.CENTER;/** * 設定透明度,主要設定的是dialog自身的透明度 */loading_pic_bigView = (ImageView) waitDialog.findViewById(R.id.loading_pic_bigView);loading_pic_bigView.setAlpha(0.6f);image = (ImageView) waitDialog.findViewById(R.id.loading_pic_big);mAnimation = AnimationUtils.loadAnimation(mContext, R.anim.loading);}public void show() {image.startAnimation(mAnimation);waitDialog.show();}public void dismiss() {waitDialog.dismiss();}//用於網路請求中斷操作public void setOnDismissListener(DialogInterface.OnDismissListener dismissListener) {waitDialog.setOnDismissListener(dismissListener);}}
布局loading:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="80.0dip" android:layout_height="80.0dip" > <ImageView android:id="@+id/loading_pic_bigView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/loading_gray" /> <ImageView android:id="@+id/loading_pic_big" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/operating" /></FrameLayout>
動畫loading:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:duration="2000" android:fromDegrees="0.0" android:toDegrees="359.0" android:pivotX="50.0%" android:pivotY="50.0%" android:repeatCount="infinite" /></set>
參考下源碼:
點擊下載源碼
Android 自訂ProgressDialog樣本實現