【Android UI设计】Dialog对话框详解(二)

上一篇咱们介绍了Dialog的基本使用方法,【Android UI设计】Dialog对话框详解(一)今天继续介绍,废话很少说,今天主要实现ProgressDialog和透明Dialog两种效果,最后介绍一下github上的一个Dialog动画开源库,里面包含多种动画特效,效果图以下:java

这里写图片描述

1、ProgressDialog基本使用

1.ProgressDialog关键代码android

mProgressDialog = new ProgressDialog(MainActivity.this);
        // 圆形progressbar
        // mProgressDialog.setProgress(ProgressDialog.STYLE_SPINNER);
        // 水平progressbar
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        // 设置ProgressDialog标题
        mProgressDialog.setTitle("每天熬夜");
        // 设置ProgressDialog提示
        mProgressDialog.setMessage("想死的心都有了···");
        // 设置ProgressDialog进度条的图标
        mProgressDialog.setIcon(R.drawable.dialog);

        // 若是设置为false就是滚动条的当前值自动在最小到最大值之间来回移动,造成这样一个动画效果,告诉别人“我正在工做”,但不能提示工做进度到哪一个阶段。
        // 主要是在进行一些没法肯定操做时间的任务时做为提示。而“明确”(true)就是根据你的进度能够设置如今的进度值。
        mProgressDialog.setIndeterminate(true);

        // 是否能够按回退键取消
        mProgressDialog.setCancelable(true);
        // 设置ProgressDialog的一个Button,可选三种值:BUTTON_POSITIVE,BUTTON_NEGATIVE,BUTTON_NEUTRAL
        mProgressDialog.setButton(ProgressDialog.BUTTON_POSITIVE, "肯定", new DialogInterface.OnClickListener()
        {

            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //点击确认以后的操做
            }
        });

        mProgressDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener()
        {

            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //点击取消以后的操做
            }
        });

        mProgressDialog.show();

2.为了展现效果,添加异步任务AsyncTask模拟进度更新git

public class MyTask extends AsyncTask<Void, Integer, Integer> {

        @Override
        protected Integer doInBackground(Void... params)
        {
            //模拟进度更新
            for (int i = 0; i <= 100; i++)
            {
                try
                {
                    Thread.sleep(40);
                    publishProgress(i);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }

            return 1;
        }

        @Override
        protected void onProgressUpdate(Integer... values)
        {
            if (values[0] == 100)
            {
                mProgressDialog.dismiss();
            }
            else
            {
                mProgressDialog.setProgress(values[0]);
            }
        }

        @Override
        protected void onPostExecute(Integer result)
        {
            if (result == 1)
            {
                Toast.makeText(MainActivity.this, "下载完成!", Toast.LENGTH_SHORT).show();
            }
        }
    }

3.在mProgressDialog.show()方法后启动任务github

// 启动AsyncTask异步任务更新Progress进度
MyTask task = new MyTask();
task.execute();

4.运行效果web

这里写图片描述

2、透明Dialog

1.准备Dialog背景图片app

这里写图片描述

2.在values/styles.xml中添加自定义透明风格异步

<style name="MyDialogStyle">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowFrame">@null</item><!--边框-->
        <item name="android:windowNoTitle">true</item><!--无标题-->
        <item name="android:windowIsFloating">true</item><!--是否浮如今activity之上-->
        <item name="android:windowIsTranslucent">true</item><!--半透明--> 
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:backgroundDimEnabled">true</item><!--模糊--> 
    </style>

3.新建DialogActivity,修改主题为Dialog样式ide

<activity
android:name=".DialogActivity"                    android:label="@string/title_activity_dialog"
<!-- 执行本身上面自定义的样式 -->
android:theme="@style/MyDialogStyle" >
</activity>

4.添加布局文件activity_dialog.xmlsvg

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent">    

    <RelativeLayout android:layout_width="200dp" android:layout_height="200dp" android:layout_centerInParent="true" android:background="@drawable/back" >  

        <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="center" android:orientation="vertical" >  

            <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" />  

            <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="正在登陆···" android:textColor="#fff" android:textSize="20sp" />  
        </LinearLayout>  

    </RelativeLayout>  

</RelativeLayout>

5.弹出Dialog,此时的Dialog其实就是一个Activity,在须要弹出的地方使用startActivity(Intent) 方法便可弹出Dialog。布局

Intent intent = new Intent(MainActivity.this,DialogActivity.class);
                startActivity(intent);

6.运行效果

这里写图片描述

3、NiftyDialogEffects开源项目

github地址:https://github.com/sd6352051/NiftyDialogEffects

1.libs目录下添加nineoldandroids-2.4.0.jar

2.使用方式,建立Dialog实例

NiftyDialogBuilder dialogBuilder=NiftyDialogBuilder.getInstance(this);

dialogBuilder
    .withTitle("Modal Dialog")
    .withMessage("This is a modal Dialog.")
    .show();

3.设置Dialog参数

dialogBuilder
    .withTitle("Modal Dialog")                                  //设置标题
    .withTitleColor("#FFFFFF")                                  //标题颜色
    .withDividerColor("#11000000")                              //分割线
    .withMessage("This is a modal Dialog.")                     //提示信息
    .withMessageColor("#FFFFFFFF")                              //信息颜色
    .withDialogColor("#FFE74C3C")                               //Dialog颜色
    .withIcon(getResources().getDrawable(R.drawable.icon))
//设置图标
    .withDuration(700)                                          //动画时间
    .withEffect(effect)                                         //动画样式
    .withButton1Text("OK")                                      //按钮1
    .withButton2Text("Cancel")                                  //按钮2
    .isCancelableOnTouchOutside(true)                           //触摸外部消失
    .setCustomView(R.layout.custom_view,v.getContext())         //设置自定义布局
    .setButton1Click(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "i'm btn1", Toast.LENGTH_SHORT).show();
                    }
    })
    .setButton2Click(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(),"i'm btn2",Toast.LENGTH_SHORT).show();
        }
    })
    .show();

4.支持的动画种类,点击查看支持的动画,实例下载:NiftyDialogEffects Demo

5.效果正如本文开头所展现的那样

这里写图片描述