美文网首页程序员Android开发Android开发
不到600行纯代码实现带动画十多种样式Dialog

不到600行纯代码实现带动画十多种样式Dialog

作者: IT平头哥 | 来源:发表于2018-03-16 11:56 被阅读2295次

    SuperDialog

    一个类文件不到600行纯代码实现多功能Dialog,list、image、input输入框、Progress自定义View和可变参数button数量
    欢迎star:https://github.com/hnsugar/SuperDialog

    Github:https://github.com/hnsugar/

    http://itgowo.com

    QQ:1264957104

    Email:lujianchao@itgowo.com

    为什么写纯代码Dialog?

    我比较追求少而精,同时不想引入太多东西,添加容易,删除是很让人郁闷的,例如
    源码导入别人的库到自己项目,我们还要对应放入各种资源文件,久而久之
    是不是文件超多,甚至都不知道是干什么的,想清理都难,如果只有一个类就可以了,
    那管理起来是不是就方便了许多呢,最重要的是,不用XML定义是很考技术的😁。
    

    本人对大量引入第三方库比较反感,会造成APP体积增大,同时存在兼容性隐患,所以我开发的
    项目原则是降低给别人造成麻烦,例如https://github.com/hnsugar/android-debugdata-webtool
    这个库是我为测试和开发写的,直接依赖就可使用,可以查看运行时APP内的数据库和共享参数及
    data目录文件管理,就这样一个库同时具备web服务器和数据接口功能,其中数据使用Json格式。

    但是,除了java和Android基本类是没有引用到第三方Json库的,不过确实用了第三方库,
    那就不得不提我另一个库https://github.com/hnsugar/IntelligentTool,自动查找第三方库并使用。
    这样我就解决了给使用者带来更多不同版本库的烦恼。

    正题

    如下全功能展示例子代码就构建了一个全功能的Dialog,如下图,需要注意的是,默认设置列表后就不会显示底部按钮,如果有特殊需要,只需要调整链式调用顺序即可。
    还有需要注意的是获取ImageView前必须先show,show操作中增加了初始化操作,不然直接get是null。buttonText设置了有奇效,很多地方都可以混用,但是我希望
    开发者按套路出牌,设置成正常的Dialog:-D。

    1. 下方按钮是代码设置drawable,根据位置设置圆角位置
    2. 相应类型方法不调用默认规则是不显示对应类型组件。
    3. 部分方法会强制相应方法设置值,但是调整调用顺序可以重新覆盖为最新设置。
      (栗子:显示列表时屏蔽下方按钮显示,但是先调用setDialogMenuItemList()后设置不显示下方按钮,如果后面调用setButtonTexts()则会把下方按钮显示出来,出现参数重置)
    4. 自定义View可以实现更多功能。
    5. 单个文件移植简单,需要定义什么字体颜色什么的自行更改,没必要提供过多的方法。

    举个栗子:

    全功能展示(链式调用顺序影响具体显示和功能效果)

    public void test1(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
    
        ArrayList<SuperDialog.DialogMenuItem> menuItems = new ArrayList<>();
        menuItems.add(new SuperDialog.DialogMenuItem("收藏", R.mipmap.ic_winstyle_favor));
        menuItems.add(new SuperDialog.DialogMenuItem("下载", R.mipmap.ic_winstyle_download));
        menuItems.add(new SuperDialog.DialogMenuItem("分享", R.mipmap.ic_winstyle_share));
        menuItems.add(new SuperDialog.DialogMenuItem("删除", R.mipmap.ic_winstyle_delete));
        menuItems.add(new SuperDialog.DialogMenuItem("歌手", R.mipmap.ic_winstyle_artist));
        menuItems.add(new SuperDialog.DialogMenuItem("专辑", R.mipmap.ic_winstyle_album));
    
        superDialog.setTitle("全功能展示Dialog").setContent("纯代码编写,没有使用XML.")
                .setListener(listener).setShowImage().setDialogMenuItemList(menuItems).setButtonTexts(new String[]{"按钮1", "按钮2", "按钮3", "按钮4"}).setImageListener(new SuperDialog.onDialogImageListener() {
            @Override
            public void onInitImageView(ImageView imageView) {
                Glide.with(imageView).load("https://www.baidu.com/img/fnj_96d95207b4a706738f1b8be3b41ea9f3.gif").into(imageView);
            }
        }).setCustomViewListener(new SuperDialog.onDialogCustomViewListener() {
            @Override
            public View onInitCustomView(LinearLayout viewGroup) {
                return new ProgressBar(viewGroup.getContext());
            }
        }).setInputListener(new SuperDialog.onDialogInputListener() {
            @Override
            public void onInitEditText(EditText inputView) {
                inputView.setHint("自定义设置");
            }
    
            @Override
            public void onComplete(int buttonIndex, String text) {
                Toast.makeText(getApplicationContext(), "输入框:" + text, Toast.LENGTH_SHORT).show();
            }
        }).show();
    
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    0.png

    普通Dialog

    public void test2(View view) {
        SuperDialog superDialog = new SuperDialog(this);
        superDialog.setTitle("提示框类型Dialog").setContent("纯代码编写,没有使用XML").setListener(listener).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    ! 1.png

    无标题Dialog

    public void test3(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
        superDialog.setContent("纯代码编写,没有使用XML\r\n没有标题").setListener(listener).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    2.png

    两个按钮

     public void test4(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
        superDialog.setTitle("2个button").setContent("纯代码编写,没有使用XML").setListener(listener).setButtonTexts(new String[]{"按钮1", "按钮2"}).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    3.png

    三个按钮

    public void test5(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
        superDialog.setTitle("3个button").setContent("纯代码编写,没有使用XML").setListener(listener).setButtonTexts(new String[]{"按钮1", "按钮2", "按钮3"}).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    4.png

    可变参数设置多个按钮

    public void test6(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
        superDialog.setTitle("可变参数N个button").setContent("纯代码编写,没有使用XML\r\n.setButtonTexts(\"按钮1\", \"按钮2\", \"按钮3\", \"按钮4\", \"按钮5\", \"按钮6\")").setListener(listener).setButtonTexts("按钮1", "按钮2", "按钮3", "按钮4", "按钮5", "按钮6").show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    5.png

    带图片文字

    布局addView后回调onInitImageView(),返回ImageView可以自己处理事件和效果
    public void test7(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
        superDialog.setTitle("带图片Dialog").setContent("纯代码编写,没有使用XML").setListener(listener).setShowImage().setImageListener(new SuperDialog.onDialogImageListener() {
            @Override
            public void onInitImageView(ImageView imageView) {
                Glide.with(imageView).load("https://www.baidu.com/img/fnj_96d95207b4a706738f1b8be3b41ea9f3.gif").into(imageView);
            }
        }).setButtonTexts(new String[]{"按钮1", "按钮2", "按钮3", "按钮4"}).show();
    
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    6.png

    列表

        public void test8(View view) {
            final SuperDialog superDialog = new SuperDialog(this);
    
            ArrayList<SuperDialog.DialogMenuItem> menuItems = new ArrayList<>();
            menuItems.add(new SuperDialog.DialogMenuItem("收藏", R.mipmap.ic_winstyle_favor));
            menuItems.add(new SuperDialog.DialogMenuItem("下载", R.mipmap.ic_winstyle_download));
            menuItems.add(new SuperDialog.DialogMenuItem("分享", R.mipmap.ic_winstyle_share));
            menuItems.add(new SuperDialog.DialogMenuItem("删除", R.mipmap.ic_winstyle_delete));
            menuItems.add(new SuperDialog.DialogMenuItem("歌手", R.mipmap.ic_winstyle_artist));
            menuItems.add(new SuperDialog.DialogMenuItem("专辑", R.mipmap.ic_winstyle_album));
    
    
            superDialog.setTitle("列表的Dialog").setContent("纯代码编写,没有使用XML").setListener(listener).setDialogMenuItemList(menuItems).show();
            superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
                }
            });
        }
    
    7.png

    单按钮默认样式输入Dialog

    布局addView前回调onInitEditText(),返回edittext可以设置事件及效果。
    未设置setButtonTexts()则进入判断,如果是输入模式且文本数组为空,则默认文本数组为{"确定"}
    public void test9(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
    
    
        superDialog.setTitle("输入框Dialog").setContent("纯代码编写,没有使用XML").setInputListener(new SuperDialog.onDialogInputListener() {
            @Override
            public void onInitEditText(EditText inputView) {
                inputView.setHint("请输入文字");
            }
    
            @Override
            public void onComplete(int buttonIndex, String text) {
                Toast.makeText(getApplicationContext(), "输入框:" + text, Toast.LENGTH_SHORT).show();
            }
        }).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    8.png

    自定义多按钮输入Dialog

    按钮受setButtonTexts()影响,设置数据会按顺序显示,onComplete()回调会返回文本和点击按钮位置,顺序与设置一致。
    public void test10(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
    
    
        superDialog.setTitle("输入框Dialog").setContent("纯代码编写,没有使用XML").setButtonTexts("取消", "更改").setInputListener(new SuperDialog.onDialogInputListener() {
            @Override
            public void onInitEditText(EditText inputView) {
                inputView.setHint("请输入文字");
            }
    
            @Override
            public void onComplete(int buttonIndex, String text) {
                if (buttonIndex == 0) {
                    Toast.makeText(getApplicationContext(), "取消输入框:" + text, Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "输入框:" + text, Toast.LENGTH_SHORT).show();
                }
            }
        }).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    9.png

    等待/进度自定义ViewDialog

    public void test11(View view) {
        final SuperDialog superDialog = new SuperDialog(this);
    
        superDialog.setTitle("进度/等待,自定义View Dialog").setContent("处理进度55%").setShowButtonLayout(false).setCustomViewListener(new SuperDialog.onDialogCustomViewListener() {
            @Override
            public View onInitCustomView(LinearLayout viewGroup) {
                return new ProgressBar(viewGroup.getContext());
            }
        }).show();
        superDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    10.png

    相关文章

      网友评论

      • 梦里风吹过:我感觉这种通用组件做成Module的形式或者直接上传用gradle来管理会更好一些,没必要刻意回避使用XML,完全没必要。纯代码在代码量少的时候好用,代码量上来之后个人感觉会更麻烦。
        梦里风吹过:@IT平头哥 远程仓库采用通用界面,定制界面的话可以考虑用继承的方法,对父类布局文件进行覆盖,这种方法需要下载库文件才能看到远程仓库的布局文件,因为有些控件的id是写死的,还要看下仓库布局文件的控件id,不然找不到会出错。如果一个库在创建的时候就考虑好这种情况定制界面问题不大。我之前就用这种方法对一个视频播放库的播放界面进行了定制。
        IT平头哥:@梦里风吹过 上远程仓库我想过,但是界面就没法定制了,所以我决定就提供一个类,方便二次开发
        IT平头哥:@梦里风吹过 如果你接手有三百多布局文件的项目就希望少点了,module形式除非定制很强,不然多了会很坑,前段时间一个第三方SDK升级了,导致静态方法不存在了,找了半天是一个公司的一个module里有个引用使用最新版,导致初期很难排查,我们自己的库有四十多个,我来了就这么多了,每个库代码兼容同一个第三方版本还不同,每次改很麻烦,关键是库就几个类,我们一个一个去排查,如果只有几个库几个module排查就简单了
      • zhcnnet:我觉得你你应该去看一些设计规范,界面不规范,我个人觉得丑。各位轻点喷😳
        IT平头哥:@zhcnnet 这就是只是思路,shape啥的包括动画都可以自己设计,我提供了复杂界面代码量就上去了,我可是很懒的😅
      • da4bbab12468:纯代码还是很好的,不然xml文件一多,看着都烦
        IT平头哥:@平凡的程序猿 是的,我也认为写太多xml太乱了
      • 阿森酱:哇哇
        IT平头哥:@沫沫咔 🤓
      • NiceBlueChai:抓哇
        IT平头哥:@NiceBlueChai 😂
        祥龙翔天:@IT平头哥 Java
        IT平头哥:@NiceBlueChai 什么意思?😂
      • IT老五:好像很不错,收藏了,有时间再看
        IT平头哥:@BEYOND_466b 😎
        BEYOND_466b:平头白发银披风,非洲大地我最凶。作者这ID不错:smile:
        IT平头哥:@ThinkinLiu 值得收藏🤓

      本文标题:不到600行纯代码实现带动画十多种样式Dialog

      本文链接:https://www.haomeiwen.com/subject/jjulqftx.html