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

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

一、ProgressDialog基本使用

1.ProgressDialog关键代码

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模拟进度更新

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()方法后启动任务

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

4.运行效果

二、透明Dialog

1.准备Dialog背景图片

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

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

4.添加布局文件activity_dialog.xml

<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.运行效果

三、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.效果正如本文开头所展示的那样

时间: 2024-09-27 04:38:05

【Android UI设计】Dialog对话框详解(二)的相关文章

【Android UI设计】ExpandableListView详解

一.前言 今天我们来实现一下如下这个效果,类似于QQ好友分组的UI效果,废话不多说,先上效果图: ExpandableListView是一个用来显示二级节点的listview.默认展示的是第一级的分组,点击某个分组后会展开该分组下的子列表,下面我们就一步步来实现这个效果. 二.实现过程 1.首先在activity_main.xml中指定ExpandableListView组件 <RelativeLayout xmlns:android="http://schemas.android.com

Android创建自定义dialog方法详解-样式去掉阴影效果

在自定义组件时,从已有组件源码中会很大收获.就拿progressDialog来说     间接父类是dialog,想了解dialog继承结构可以去百度,或者    从构造器来说ProgressDialog(Context context, int theme)很明显需要个样式主题文件,我们可以在value文件下自定义一个样式文件.   从外观上需要个动态效果控件和文本框两个属性    ProgressBar mProgress;   TextView mMessageView源码中onCreat

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

所谓Dialog其实就是一个小窗口,用户在对界面进行某些操作的时候,可以通过Dialog来响应,对用户进行反馈,但是我们一般在使用Dialog的时候是不会直接使用Dialog来进行编码创建对话框,而是使用它的子类来进行操作: AlertDialog 一个对话框-–可以显示一个标题,最多三个按钮,一个可选项列表,或自定义布局. Dialog继承关系图 其他子类不在此处介绍,本篇主要介绍AlertDialog和Android官方推荐使用的DialogFragment这两种方式来创建Dialog. D

Android活动条(actionbar)使用详解(二)

  1.使用ActionBar实现Tab导航 使用ActionBar实现Tab导航的思路是:AcitonBar通常与Fragment结合使用实现Tab导航.ActionBar在顶端生成多个Tab标签,当用户点击某个Tab标签时,系统根据用户点击事件导航指定Tab页面.实现步骤如下: (1)调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式; (2)调用ActionBar的addTab()方法添加多个

Kafka 设计与原理详解(二)

六.Kafka主要配置 6.1 Broker Config 属性 默认值 描述 broker.id 必填参数,broker的唯一标识 log.dirs /tmp/kafka-logs Kafka数据存放的目录.可以指定多个目录,中间用逗号分隔,当新partition被创建的时会被存放到当前存放partition最少的目录. port 9092 BrokerServer接受客户端连接的端口号 zookeeper.connect null Zookeeper的连接串,格式为:hostname1:po

Android基础入门教程——2.5.3 AlertDialog(对话框)详解

Android基础入门教程--2.5.3 AlertDialog(对话框)详解 标签(空格分隔): Android基础入门教程 本节引言: 本节继续给大家带来是显示提示信息的第三个控件AlertDialog(对话框),同时它也是其他 Dialog的的父类!比如ProgressDialog,TimePickerDialog等,而AlertDialog的父类是:Dialog! 另外,不像前面学习的Toast和Notification,AlertDialog并不能直接new出来,如果你打开 Alert

【转】【Android UI设计与开发】第07期:底部菜单栏(二)Fragment的详细介绍和使用方法

原始地址:http://blog.csdn.net/yangyu20121224/article/category/1431917/1 由于TabActivity在Android4.0以后已经被完全弃用,那么我就不再浪费口水继续讲解它了,取而代之的是Fragment.Fragment是Android3.0新增的概念,Fragment翻译成中文是碎片的意思,不过却和Activity十分的相似,这一篇我花大量的篇幅来详细的讲解Fragment的介绍和使用方法. 一.Fragment的基础知识介绍  

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay