DialogX 的一些骚包的高阶运用技巧

DialogX 是一款轻松易用的对话框组件,具备高扩展性和易上手的特点,包含各种自定义主题款式,能够快速完成林林总总的对话框作用,也防止了 AlertDialog 的许多蛋疼的问题,概况能够参阅这篇文章:运用 DialogX 快速构建 Android App 对话框 – ()

本篇文章将介绍一些 DialogX 的运用技巧,也欢迎咱们集思广益在谈论区留下宝贵的建议,DialogX 自始至终的方针都是尽量让开发变得愈加简略,基于此目的,DialogX 首要想做的便是防止重复性劳作,一般咱们开发产品总会有一些林林总总的需求,比方关于对话框发动和封闭的动画

部分>组件内>大局收效的特点

部分设置

DialogX 的很多特点都能够自定义调整,最简略的便是经过实例的 set 办法对特点进行调整,例如关于动画,你能够运用这些 set 办法进行调整:

DialogX 的一些骚包的高阶使用技巧

但是,当咱们的程序中有很多的对话框,但每个 MessageDialog 都需求调整,又不能影响其他对话框的动画,该怎样设置呢?

组件收效

此刻就能够运用该对话框的静态办法直接进行设置,例如:

MessageDialog.overrideEnterDuration = 100;    //入场动画时长为100毫秒
MessageDialog.overrideExitDuration = 100;     //进场动画时长为100毫秒
MessageDialog.overrideEnterAnimRes = R.anim.anim_dialogx_top_enter;  //入场动画资源
MessageDialog.overrideExitAnimRes = R.anim.anim_dialogx_top_exit;    //进场动画资源

假如要设置的特点想针对大局,也便是所有对话框都收效,此刻能够运用大局设置进行调整:

大局设置

你能够随时召唤神龙 DialogX,直接修正静态特点,这里的设置都是针对大局的,能够快速完结需求的调整。

DialogX.enterAnimDuration = 100;
DialogX.exitAnimDuration = 100;

上边演示的是动画相关设置,除此之外,你还能够对对话框的标题文字款式、对话框OK按钮的款式、撤销按钮的款式、正文内容的文字款式等等进行大局的调整,只需求知道特点收效的优先级是:

优先级为:实例运用set办法设置 > 组件override设置 > 大局设置。

额外的,假如需求对部分组件的行为进行调整,例如 PopTip 的默许显现位置位于屏幕底部,但产品或规划要求想显现到屏幕中心,但这个设置又取决于主题的限制,此刻你能够经过重写主题的设置来完成调整:

覆盖主题设置

想要将 PopTip 吐司提示不按照主题的设定(例如屏幕底部)显现,而是以自己的要求显现(例如屏幕中心),但关于 PopTip 的 align 特点归于主题操控的,此刻能够经过重写主题来调整对话框的部分行为,例如:

DialogX.globalStyle = new MaterialStyle(){
    @Override
    public PopTipSettings popTipSettings() {
        return new PopTipSettings() {
            @Override
            public ALIGN align() {
                return ALIGN.CENTER;
            }
        };
    }
};

DialogX 强壮的扩展性允许你发挥更多幻想空间!假如你的产品经理或许规划师仍然不满足于简简略单的动画,想要定制更为丰厚的入场/进场作用,此刻能够运用 DialogX 预留的对话框动画操控接口对每一个对话框内的组件动画细节进行定制。

彻底的动画细节定制

例如,咱们能够针对一个对话框的布景遮罩进行透明度动画作用处理,但关于对话框内容部分进行一个从屏幕顶部进入的动画作用,其他的,请发挥你的幻想进行规划吧!

运用 DialogXAnimInterface 接口能够彻底自定义敞开、封闭动画。

由于 DialogX 对话框组件的内部元素都是露出的,你能够轻松获取并拜访内部实例,运用这一点,再加上 DialogXAnimInterface 会负责对话框发动和封闭的动画行为,你能够充分运用它完成你想要的作用。

例如关于一个 CustomDialog,你能够这样操控其发动和封闭动画:

CustomDialog.show(new OnBindView<CustomDialog>(R.layout.layout_custom_dialog) {
            @Override
            public void onBind(final CustomDialog dialog, View v) {
                //...
            }
        })
        //完成彻底自定义动画作用
        .setDialogXAnimImpl(new DialogXAnimInterface<CustomDialog>() {
            //发动对话框动画逻辑
            @Override
            public void doShowAnim(CustomDialog customDialog, ObjectRunnable<Float> animProgress) {
                //创立一个资源动画
                Animation enterAnim;
                int enterAnimResId = com.kongzue.dialogx.R.anim.anim_dialogx_top_enter;
                enterAnim = AnimationUtils.loadAnimation(me, enterAnimResId);
                enterAnim.setInterpolator(new DecelerateInterpolator(2f));
                long enterAnimDurationTemp = enterAnim.getDuration();
                enterAnim.setDuration(enterAnimDurationTemp);
                customDialog.getDialogImpl().boxCustom.startAnimation(enterAnim);	//经过 getDialogImpl() 获取内部露出的 boxCustom 元素
                //创立一个布景遮罩层的突变动画
                ValueAnimator bkgAlpha = ValueAnimator.ofFloat(0f, 1f);
                bkgAlpha.setDuration(enterAnimDurationTemp);
                bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        //汇报动画进展,一同 animation.getAnimatedValue() 将改变遮罩层的透明度
                        animProgress.run((Float) animation.getAnimatedValue());
                    }
                });
                bkgAlpha.start();
            }
            //封闭对话框动画逻辑
            @Override
            public void doExitAnim(CustomDialog customDialog, ObjectRunnable<Float> animProgress) {
                //创立一个资源动画
                int exitAnimResIdTemp = com.kongzue.dialogx.R.anim.anim_dialogx_default_exit;
                Animation exitAnim = AnimationUtils.loadAnimation(me, exitAnimResIdTemp);
                customDialog.getDialogImpl().boxCustom.startAnimation(exitAnim);	//经过 getDialogImpl() 获取内部露出的 boxCustom 元素
                //创立一个布景遮罩层的突变动画
                ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
                bkgAlpha.setDuration(exitAnim.getDuration());
                bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        //汇报动画进展,一同 animation.getAnimatedValue() 将改变遮罩层的透明度
                        animProgress.run((Float) animation.getAnimatedValue());
                    }
                });
                bkgAlpha.start();
            }
        });

关于 animProgress 它本质上是个反向回调履行器,由于动画时长不定,你需求告诉 DialogX 当前你的动画抵达哪个阶段了,对话框需求依据这个阶段进行操作处理,例如封闭动画履行进程应当是 1f 至 0f 的进程,完毕后应当销毁对话框,那么当 animProgress.run(0f) 时就会履行销毁流程,而发动动画应当是 0f 至 1f 的进程,当 animProgress.run(1f) 时发动对话框的动画彻底履行完毕。

别的,你有没有注意到上述代码中的一个小细节?你能够经过 .getDialogImpl() 拜访对话框的所有内部实例,这意味着,DialogX 中的所有实例事实上都是对外开放的,你能够在对话框发动后(DialogLifecycle#onShow)经过 DialogImpl 获取对话框的所有内容组件,对他们进行你想做的调整和设置,这都将极大程度上方便开发者对对话框内容进行定制。

正如我一开端所说,DialogX 将坚持尽力打造一款更好用,更高效可定制化的对话框组件。

行列对话框

某些场景下需求有“模态”对话框的需求,即,一次性创立多个对话框,组成行列,逐一显现,当上一个对话框封闭时主动发动下一个对话框,此刻能够运用行列对话框来完结。

示例代码如下,在 DialogX.showDialogList(...) 中构建多个对话框,请注意这些对话框有必要是没有发动的状况,运用 .build() 办法完结构建,以 “,” 分隔组成行列,即可主动发动。

DialogX.showDialogList(
        MessageDialog.build().setTitle("提示").setMessage("这是一组音讯对话框行列").setOkButton("开端").setCancelButton("撤销")
                .setCancelButton(new OnDialogButtonClickListener<MessageDialog>() {
                    @Override
                    public boolean onClick(MessageDialog dialog, View v) {
                        dialog.cleanDialogList();
                        return false;
                    }
                }),
        PopTip.build().setMessage("每个对话框会顺次显现"),
        PopNotification.build().setTitle("告诉提示").setMessage("直到上一个对话框消失"),
        InputDialog.build().setTitle("请注意").setMessage("你有必要运用 .build() 办法构建,并确保不要自己履行 .show() 办法").setInputText("输入文字").setOkButton("知道了"),
        TipDialog.build().setMessageContent("预备完毕...").setTipType(WaitDialog.TYPE.SUCCESS),
        BottomDialog.build().setTitle("完毕").setMessage("下滑以完毕旅程,祝你编码愉快!").setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_dialog) {
            @Override
            public void onBind(BottomDialog dialog, View v) {
                ImageView btnOk;
                btnOk = v.findViewById(R.id.btn_ok);
                btnOk.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                                        dialog.dismiss();
                                    }
                });
            }
        })
);

运用进程中,随时能够运用 .cleanDialogList() 来停止接下来的行列对话框的显现。

多种构建形式

DialogX 的对话框支持多种构建形式,开发者能够随意挑选自己最为随手的办法对对话框进行构建,大大提高开发功率。

例如关于一个音讯对话框,你能够运用最基础的 new 指令构建:

new MessageDialog()
    .setTitle("标题")
    .setMessage("内容")
    .setOkButton("确认", new new OnDialogButtonClickListener<MessageDialog>() {
            @Override
            public boolean onClick(MessageDialog baseDialog, View v) {
                toast("点击确认按钮");
                return false;
            }
        })
    .setCancelButton(...)
    .show();

也能够运用 build 构建:

MessageDialog.build()
        .setTitle("标题")
        .setMessage("内容")
        .setOkButton("确认")
        .show();

亦能够运用静态办法快速构建:

MessageDialog.show("标题", "正文内容", "确认").setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
    @Override
    public boolean onClick(MessageDialog baseDialog, View v) {
        toast("点击确认按钮");
        return false;
    }
});

为所欲为,想怎样写就怎样写。

推迟处理用户挑选

懒得对每个按钮写回调?业务不需求点击按钮后立即进行处理?或许不管用户点击哪个按钮都有相同的业务代码要处理?彻底不需求担心,DialogX 的对话框在封闭后仍然会保存用户挑选的状况,只要你持有它的实例,仍然能够随时获取用户挑选的按钮状况:

private MessageDialog dialog;
//业务流程模仿,创立并显现了一个对话框,但不立即处理点击业务
dialog = MessageDialog.show("Title", "Ask Question", "OK", "NO", "OTHER");
//需求时可依据 getButtonSelectResult() 办法获取用户点击了哪个按钮选项
BUTTON_SELECT_RESULT result = dialog.getButtonSelectResult();

BUTTON_SELECT_RESULT 是一个枚举,它包含以下类型:

NONE,           //未做出挑选
BUTTON_OK,      //挑选了确认按钮
BUTTON_CANCEL,  //挑选了撤销按钮
BUTTON_OTHER    //挑选了其他按钮

你能够依据它的状况判断用户点击了哪个按钮。

基于这个特性,假如业务流程中针对用户的挑选,不管挑选哪个选项都有相同部分的代码需求履行,那么开发者也能够在用户挑选后,例如在对话框的封闭事情中对用户的挑选进行统一处理,减少重复代码量:

new MessageDialog() {
    @Override
    public void onDismiss(MessageDialog dialog) {
        BUTTON_SELECT_RESULT result = dialog.getButtonSelectResult();
        //处理 result...
    }
}

关于底部菜单对话框 BottomMenu、弹出悬浮菜单 PopMenu,也有相应的 get 办法能够获取用户挑选的菜单索引或菜单文本,你能够在任何时间对用户的挑选进行处理。

DialogX 的所有规划均在尽力减少开发难度,提高开发功率,使调用和构建一个令人满意的菜单变得愈加简单。

尾巴

DialogX 正在尽力打造一款对开发者更友爱,运用起来更为简略方便的对话框组件,若你有好的主意,也欢迎加入进来一同为 DialogX 添砖加瓦,经过 Github 一同让 DialogX 变得愈加强壮!

DialogX 路牌:github.com/kongzue/Dia…