Android 自訂ProgressDialog樣本實現

來源:互聯網
上載者:User

標籤: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樣本實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.