我们在项目中经常会遇到这样一个应用场景:执行某个耗时操作时,为了安抚用户等待的烦躁心情我们一般会使用进度条之类的空间,在android中让大家最容易想到的就是progressbar或者progressDialog,区别在于前者是一个控件,后者是对话框。由于一些需求在弹出进度条时不希望用户能够操作其他控件,所以只能使用progressDialog,这个时候有遇到了一个问题,我不想要progressDialog的黑色框框,感觉这样跟应用的整体风格不协调,这个时候就考虑了写一个自定义的progressDialog。
在网上搜过很多自定义progressDialog的例子,对着写了下,但是没有任何效果,不知道是自己使用的方法不对还是什么地方出错了。通过不断的查找资料,写了一个简单的自定义progressDialog。先上图看下效果:

1.String.xml 文件,progressDialog是继承与Dialog,先设置一下progressDialog的风格,设置背景透明色。

<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>

2.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>


3.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>

4.CustomProgressDialog.java文件,这个是就是我们最终需要使用的progressDialog了。

/*************************************************************************************** [Project]*       MyProgressDialog* [Package]*       com.lxd.widgets* [FileName]*       CustomProgressDialog.java* [Copyright]*       Copyright 2012 LXD All Rights Reserved.* [History]*       Version          Date              Author                        Record*--------------------------------------------------------------------------------------*       1.0.0           2012-4-27         lxd (rohsuton@gmail.com)        Create**************************************************************************************/package com.lxd.widgets;import com.lxd.activity.R;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;/******************************************************************** * [Summary] *       TODO 请在此处简要描述此类所实现的功能。因为这项注释主要是为了在IDE环境中生成tip帮助,务必简明扼要 * [Remarks] *       TODO 请在此处详细描述类的功能、调用方法、注意事项、以及与其它类的关系. *******************************************************************/public class CustomProgressDialog extends Dialog {private Context context = null;private static CustomProgressDialog customProgressDialog = null;public CustomProgressDialog(Context context){super(context);this.context = context;}public CustomProgressDialog(Context context, int theme) {        super(context, theme);    }public static CustomProgressDialog createDialog(Context context){customProgressDialog = new CustomProgressDialog(context,R.style.CustomProgressDialog);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();    }     /**     *      * [Summary]     *       setTitile 标题     * @param strTitle     * @return     *     */    public CustomProgressDialog setTitile(String strTitle){    return customProgressDialog;    }        /**     *      * [Summary]     *       setMessage 提示内容     * @param strMessage     * @return     *     */    public CustomProgressDialog setMessage(String strMessage){    TextView tvMsg = (TextView)customProgressDialog.findViewById(R.id.id_tv_loadingmsg);        if (tvMsg != null){    tvMsg.setText(strMessage);    }        return customProgressDialog;    }}

5.接下来就是写一个测试activity调用我们的progressDialog了。

package com.lxd.activity;import com.lxd.widgets.CustomProgressDialog;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.Window;import android.view.WindowManager;public class MainFrame extends Activity {private MainFrameTask mMainFrameTask = null;private CustomProgressDialog progressDialog = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        this.requestWindowFeature(Window.FEATURE_NO_TITLE);        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,        WindowManager.LayoutParams.FLAG_FULLSCREEN);                setContentView(R.layout.main);                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 = CustomProgressDialog.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 MainFrame mainFrame = null;public MainFrameTask(MainFrame 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();}}}

这样我们需要的progressDialog效果就出来了,希望对遇到跟我类似问题的朋友有所帮助,里面有什么写的不对的地方请大家指教。

转载请指明出处:http://blog.csdn.net/rohsuton/article/details/7518031

最后贴上完整代码:自定义ProgressDialog

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android桌面管理
  6. Android(安卓)带文字的进度条,文字颜色随进度条的增加而渐变的效
  7. android绚丽的ListView表格效果的实现
  8. Dex文件结构
  9. Android(安卓)Studio JNI 开发简单案例

随机推荐

  1. WebSocket实现Android客户端之间的简单通
  2. 个人开发者做一款Android(安卓)App需要知
  3. 再谈Android的许可证
  4. android 添加按电源键结束通话
  5. Android(安卓)studio 小白使用Android(安
  6. Android中序列化的Parcelable与Serializa
  7. ANDROID+SQLITE详解2
  8. Android 消息推送
  9. Android(安卓)Activity 与Service进行数
  10. Android实现HID鼠标的指针自定义