关闭

自定义“菊花dialog”

268人阅读 评论(0) 收藏 举报

参考文章:http://www.androidchina.net/2297.html


在原文的基础上,只做了少量修改,就是把两个类合成了一个类,并且加上了五秒之后dialog被dismiss的两种方法。


1.首先是动画文件 :一张图片360一直旋转

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/loading2"
    android:fromDegrees="0.0"
    android:pivotX="50.0%"
    android:pivotY="50.0%"
    android:toDegrees="360.0" />

注:此处为父布局添加 android:background=”@android:color/transparent” 属性,使布局透明。


2.自定义方法加载dialog

public class DialogUtils {
	/**
	 * 创建自定义ProgressDialog
	 */
	public static Dialog createLoadingDialog(Context context) {
		LayoutInflater inflater = LayoutInflater.from(context);
		View v = inflater.inflate(R.layout.layout_loading_dialog, null); // 得到加载view
		LinearLayout layout = (LinearLayout) v.findViewById(R.id.dialog_view); // 加载布局
		Dialog loadingDialog = new Dialog(context, R.style.loading_dialog); // 创建自定义样式dialog
		loadingDialog.setCancelable(false); // 不可以用"返回键"取消
		loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT));
		return loadingDialog;
	}
}
注:此方法中设置了  loadingDialog.setCancelable(false);  即:不可以用”返回键”取消,若不需要可注释掉。


3.主类

public class MainActivity extends Activity {
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				mLoading.dismiss();
				break;
			}
		};
	};
	Handler handler2 = new Handler();

	// 初始化Dialog
	public Dialog mLoading;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mLoading = DialogUtils.createLoadingDialog(this);
		setUpViews();
	}

	private void setUpViews() {
		/****************************************
		 * 只需要在此处调用show()方法
		 * 注: 可在访问网络开始时的回调方法中调用 在访问结束后; 
		 * 再 mLoading.dismiss();
		 ****************************************/
		mLoading.show();
		handler.postDelayed(new Runnable() {

			@Override
			public void run() {
				mLoading.dismiss();
			}
		}, 5000);
		// new Thread(new Runnable() {
		//
		// @Override
		// public void run() {
		// while (true) {
		// // mLoading.show();
		// try {
		// Thread.sleep(5000);
		// } catch (InterruptedException e) {
		// // TODO Auto-generated catch block
		// e.printStackTrace();
		// }
		// Message msg = new Message();
		// msg.what = 1;
		// handler.sendMessage(msg);
		// // mLoading.dismiss();
		// }
		// }
		// }).start();
	}
}
不用handler,直接用线程五秒之后执行dismiss操作的话,就会崩掉。

一个是用handler发送message,在handler中执行dismiss操作。

而是利用handler的postDelayed(Runnable r, long delayMillis)方法,在线程中执行dismiss操作。

styles.xml文件部分:

 <!-- 自定义loading dialog -->
    <style name="loading_dialog" parent="android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>
dialog_view.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialog_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/dialog_bg"
    android:gravity="center_vertical|center"
    android:orientation="vertical"
    android:padding="10dp" >

    <ProgressBar
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="50dip"
        android:layout_height="60dip"
        android:indeterminateDrawable="@anim/progress_bar" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="激活中..."
        android:textColor="#FFFFFF"
        android:textSize="25sp" />

</LinearLayout>


现在添加一个圆形的进度条文件:

<style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">#00000000</item>
        <item name="android:windowBackground">@drawable/dialogbk</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

romacting.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="200dp"
    android:layout_height="200dp" >

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_margin="30dp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar1"
        android:layout_centerHorizontal="true"
        android:text="@string/romacting"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

dialogbk.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 上面两个方角,下面两个圆角 -->
    <!-- 背景 -->
    <gradient
        android:angle="270"
        android:endColor="#a2afbc"
        android:startColor="#697585" >
    </gradient>
    <!-- 边界线 -->
    <stroke
        android:width="3dp"
        android:color="#606060"/>

    <corners android:radius="10dp" >
    </corners>

</shape>


MainActivity类

public class MainActivity extends Activity {
        // 无关代码全部删掉,刷掉dialog依旧是dismiss()方法。
<span style="white-space:pre">	</span>// 点击按钮触发事件,启动dialog进度条,可以在xml文件中按钮处加上一个属性,android:onClick="onRomact"
<span style="white-space:pre">	</span>// 这样点就按钮依旧可以启动相应 的事件
	public Dialog waiting = null
	public void onRomact(View v) {
		Log.i(TEST_TAG, "555555"); // 2
		waiting = new Dialog(this, R.style.dialog);
		waiting.setCancelable(false);
		waiting.setContentView(R.layout.romacting);
		waiting.show();
		new Timer().schedule(new TimerTask() {

			@Override
			public void run() {
				ready = true;
				mHand.sendEmptyMessage(0);
			}
		}, 1000 * 10);
	}

}








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31624次
    • 积分:682
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:4篇
    • 译文:0篇
    • 评论:10条
    文章分类