闲来无事,总结了两个自定义的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;
@Override
protected 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);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 示例1
case R.id.btn_customDialog1:
Intent intent1 = new Intent(this, DialogActivity1.class);
startActivity(intent1);
break;
// 示例2
case 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
mMainFrameTask = new MainFrameTask(this);
mMainFrameTask.execute();
}
@Override
protected 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;
}
@Override
protected void onCancelled() {
stopProgressDialog();
super.onCancelled();
}
@Override
protected Integer doInBackground(Integer... params) {
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
startProgressDialog();
}
@Override
protected 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>
<?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-list
xmlns: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;
@Override
protected 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>
<?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>
参考下源码: