美文网首页
提示窗控件

提示窗控件

作者: 小斌_bingor | 来源:发表于2018-11-14 11:12 被阅读0次

前言

无论做什么应用,总是会需要提示窗(loading、确认、子选项选择等等),我已经厌倦了每次需要新的提示窗都要去重新继承一个Dialog/重新折腾一个PopupWindow了,所以搞了一个通用的提示窗,支持自己塞一个自定义的布局进去,也实现了几种常用的布局

示例

地址

TipWindow

使用方法

引用方法
  1. 在项目的Gradle文件
allprojects {
    repositories {
        .......
        maven { url 'https://jitpack.io' }
    }
}
  1. 在你要用这个控件的模块gradle文件
implementation 'com.github.NotSeriousCoder:TipWindow:{lastversion}'
lastversion请自行查看github的releases
初始化
//这里有TipWindowBuilder.TIP_TYPE_WINDOW和TipWindowBuilder.TIP_TYPE_DIALOG两种模式
//分别用PopupWindow和Dialog实现窗口
new CustomTipWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_WINDOW)
.各种set
.create()
.show()
普通文本模式
 new CustomTipWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_DIALOG)
                        //不设置就没有确定按钮
                        .setOK("好的")
                        //不设置就没有取消按钮
                        .setCancel("不要")
                        //窗口是否包裹内容
                        .setWrapContent(true)
                        //文字内容
                        .setTextContent("确定要删除这个文件吗~~")
                        //空白处不透明度1=全黑 0=透明
                        .setAlpha(0.3f)
                        //是否能点击空白处/返回键关闭窗口(WINDOW模式下,无法拦截返回键QAQ)
                        .setCancelable(false)
                        //回调
                        .setOnWindowStateChangedListener(new OnWindowStateChangedListener() {
                            @Override
                            public void onOKClicked() {
                                Toast.makeText(getBaseContext(), "好吧", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onCancelClicked() {
                                Toast.makeText(getBaseContext(), "取消", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onOutsideClicked() {
                                Toast.makeText(getBaseContext(), "窗户消失", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .create()
                        //DIALOG模式下,传null就行,WINDOW模式下,传界面里面的任意一个View就好
                        .show(findViewById(R.id.ll_main));
窗体包裹内容+0.3不透明度
窗体不包裹内容+1不透明度
自定义控件模式
new CustomTipWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_DIALOG)
                        //不设置就没有确定按钮
                        .setOK("好的")
                        //不设置就没有取消按钮
                        .setCancel("不要")
                        //窗口是否包裹内容
                        .setWrapContent(false)
                        //自定义控件
                        .setContentView(soundVolume.getSoundVolumeView(MainActivity.this))
                        //设置了自定义控件,就不要再设置文字了哦,会被覆盖的
                        //.setTextContent("确定要删除这个文件吗~~")
                        //空白处不透明度1=全黑 0=透明
                        .setAlpha(0.2f)
                        //是否能点击空白处/返回键关闭窗口(WINDOW模式下,无法拦截返回键QAQ)
                        .setCancelable(false)
                        //回调
                        .setOnWindowStateChangedListener(new OnWindowStateChangedListener() {
                            @Override
                            public void onOKClicked() {
                                Toast.makeText(getBaseContext(), "好吧", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onCancelClicked() {
                                Toast.makeText(getBaseContext(), "取消", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onOutsideClicked() {
                                Toast.makeText(getBaseContext(), "窗户消失", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .create()
                        //DIALOG模式下,传null就行,WINDOW模式下,传界面里面的任意一个View就好
                        .show(findViewById(R.id.ll_main));
自定义控件模式
时间选择器模式

滚轮控件用的是别人的代码,但是忘记是在哪拿的了。。。
是一位叫李玉江的大神(代码注释里面写的),如果作者恰好看到了,可以联系我,我把出处贴上,多谢

new DateTimePickerWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_WINDOW)
                        //不设置就没有确定按钮
                        .setOK("好的")
                        //不设置就没有取消按钮
                        .setCancel("不要")
                        //窗口是否包裹内容
                        .setWrapContent(false)
                        //空白处不透明度1=全黑 0=透明
                        .setAlpha(0.2f)
                        //是否能点击空白处/返回键关闭窗口(WINDOW模式下,无法拦截返回键QAQ)
                        .setCancelable(false)
                        //日期选择器回调
                        .setOnDataTimeDialogListener(new OnDataTimeDialogListener() {
                            @Override
                            public void onOKClicked(@NotNull String dateTimeFormat, long dateTime) {
                                Toast.makeText(getBaseContext(), dateTimeFormat, Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onCancelClicked() {
                                Toast.makeText(getBaseContext(), "取消", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onOutsideClicked() {
                                Toast.makeText(getBaseContext(), "窗户消失", Toast.LENGTH_SHORT).show();
                            }
                        })
                        //滚轮竖向间距(2-4),不设置默认为2,数字越大,间距越大
                        .setLineSpaceMultiplier(2)
                        //设置字号(px),默认14sp
                        .setTextSize(UnitConverter.sp2px(getBaseContext(), 18))
                        //滚轮正常文字的颜色(同时也是顶部Tab的非选中文字颜色)
                        .setTextColorNormal(getResources().getColor(R.color.colorAccent))
                        //滚轮聚焦文字的颜色(同时也是顶部Tab的选中文字颜色)
                        .setTextColorFocus(Color.parseColor("#0069E6"))
                        //设置滚轮分割线颜色(同时也是顶部Tab的选中颜色)
                        .setDividerColor(Color.parseColor("#1E802A"))
                        //设置滚轮分割线宽度比例
                        .setDividerWidthRatio(0.7f)
                        //设置滚轮可见项数量
                        .setVisibleItemCount(7)
                        //设置是否可以循环滚动,默认可以
                        .setCycleable(true)
                        //起始时间,不设置默认1-1-1 0:0
                        .setDateTimeStart(1995, 3, 20, 0, 0)
                        //终止时间,不设置默认9999-12-31 23:59
                        .setDateTimeEnd(2222, 8, 8, 23, 59)
                        //默认显示时间,不设置默认当前时间
                        .setDateTimeInit(2018, 10, 22, 10, 29)
                        //设置显示模式(日期-时间/仅日期/仅时间)
                        /**
                         * {@link DateTimePickerView#TYPE_NORMAL}
                         * {@link DateTimePickerView#TYPE_JUST_DATE}
                         * {@link DateTimePickerView#TYPE_JUST_TIME}
                         */
                        .setType(DateTimePickerView.TYPE_JUST_TIME)
                        .create()
                        .show(findViewById(R.id.bt_data_picker));
时间选择器模式
列表模式
new ListTipWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_WINDOW)
                        //窗口是否包裹内容
                        .setWrapContent(false)
                        //空白处不透明度1=全黑 0=透明
                        .setAlpha(0.2f)
                        //是否能点击空白处/返回键关闭窗口(WINDOW模式下,无法拦截返回键QAQ)
                        .setCancelable(false)
                        //列表适配器
                        .setAdapter(adapter)
                        .setOnItemClickListener(new OnItemClickListener<String>() {
                            @Override
                            public void onItemClick(AdapterView<?> parent, View view, int position, long id, String data) {
                                Toast.makeText(getBaseContext(), data, Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onItemDeleteClick(int position, String data) {
                                Toast.makeText(getBaseContext(), "del==" + data, Toast.LENGTH_SHORT).show();
                            }
                        })
                        .create()
                        .show(findViewById(R.id.bt_list));

其中adapter可以使用一个默认的SimpleListAdapter

List<String> data = new ArrayList<>();
                    data.add("13710267845");
                    data.add("15025515656");
                    data.add("13325161561");
                    data.add("18945851215");
                    data.add("18154545455");
                    data.add("16545145158");
                    data.add("15454661456");
                    data.add("18714545458");
                    adapter = new SimpleListAdapter(MainActivity.this, data, Color.parseColor("#1a56f1"));
                    //是否需要删除按钮
                    adapter.setNeedDelete(true);
                    //是否需要选中标签
                    adapter.setNeedTag(true);

当然你也可以自定义,继承com.bingor.poptipwindow.adapter.GeneralAdapter<Data>


列表模式
Loading模式
new WaitingWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_WINDOW)
                        //设置空白处不透明度(0=完全透明 1=完全不透明)
                        .setAlpha(0.2f)
                        //设置是否能点击空白处取消(TIP_TYPE_WINDOW模式下对返回键无效,待改进)
                        .setCancelable(false)
                        //提示语
                        .setMsg("读取中")
                        //设置字号(px),默认16sp
                        .setTextSize(UnitConverter.sp2px(getBaseContext(), 18))
                        //动画的图标
                        .setImageResource(R.drawable.ic_test)
                        //窗口是否包裹内容
                        .setWrapContent(false)
                        .create()
                        .show(findViewById(R.id.bt_data_picker));
Loading模式
通用联动滚轮模式

首先,需要将你的javaBean实现com.bingor.poptipwindow.view.wheel.WheelItem接口,
比如像这样:

public class TestBean implements WheelItem {
    private List<TestBean> children;
    private String name;

    public TestBean(String name) {
        super();
        this.name = name;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public List<TestBean> getChildren() {
        return children;
    }
    public void setChildren(List<TestBean> children) {
        this.children = children;
    }
}

最多支持4层深度,大于4层的数据不会展示出来,提供给大家一组测试数据

List<TestBean> d_1 = new ArrayList();

                // 第一层节点1
                TestBean tb_1a = new TestBean("1a");

                List<TestBean> d_2a = new ArrayList();
                // 第二层节点123
                TestBean tb_2a = new TestBean("2a");
                TestBean tb_2b = new TestBean("2b");
                TestBean tb_2c = new TestBean("2c");
                TestBean tb_2d = new TestBean("2d");
                TestBean tb_2e = new TestBean("2e");
                TestBean tb_2f = new TestBean("2f");
                TestBean tb_2g = new TestBean("2g");
                d_2a.add(tb_2a);
                d_2a.add(tb_2b);
                d_2a.add(tb_2c);
                d_2a.add(tb_2d);
                d_2a.add(tb_2e);
                d_2a.add(tb_2f);
                d_2a.add(tb_2g);
                tb_1a.setChildren(d_2a);
                d_1.add(tb_1a);

                // 第一层节点2
                TestBean tb_1b = new TestBean("1b");
                List<TestBean> d_2b = new ArrayList();
                // 第二层节点4
                TestBean tb_2h = new TestBean("2h");
                List<TestBean> d_3a = new ArrayList();
                // 第三层节点12
                TestBean tb_3a = new TestBean("3a");
                TestBean tb_3b = new TestBean("3b");
                d_3a.add(tb_3a);
                d_3a.add(tb_3b);
                tb_2d.setChildren(d_3a);
                d_2b.add(tb_2d);
                tb_1b.setChildren(d_2b);
                d_1.add(tb_1b);

                // 第一层节点3
                TestBean tb_1c = new TestBean("1c");
                List<TestBean> d_2c = new ArrayList();
                // 第二层节点56
                TestBean tb_2i = new TestBean("2i");
                TestBean tb_2j = new TestBean("2j");
                List<TestBean> d_3b = new ArrayList();
                // 第三层节点3
                TestBean tb_3c = new TestBean("3c");
                List<TestBean> d_4a = new ArrayList();
                // 第四层节点12
                TestBean tb_4a = new TestBean("4a");
                TestBean tb_4b = new TestBean("4b");

                d_4a.add(tb_4a);
                d_4a.add(tb_4b);
                tb_3c.setChildren(d_4a);
                d_3b.add(tb_3c);
                tb_2e.setChildren(d_3b);
                d_2c.add(tb_2e);
                d_2c.add(tb_2f);
                tb_1c.setChildren(d_2c);
                d_1.add(tb_1c);

开始使用

new UniversalPickerWindowBuilder(MainActivity.this, TipWindowBuilder.TIP_TYPE_WINDOW)
                        //设置空白处不透明度(0=完全透明 1=完全不透明)
                        .setAlpha(0.2f)
                        .setOK("选定")
                        .setOnDataSelectedListener(new OnDataSelectedListener() {
                            @Override
                            public void onOKClicked(@NotNull List<? extends WheelItem> items, @NotNull int[] positions) {
                                for (int i = 0; i < items.size(); i++) {
                                    TestBean testBean = (TestBean) items.get(i);
                                    Log.d("HXB", testBean.getName());
                                }
                                for (int pos : positions) {
                                    Log.d("HXB", "pos==" + pos);
                                }
                            }

                            @Override
                            public void onCancelClicked() {

                            }

                            @Override
                            public void onOutsideClicked() {

                            }
                        })
                        //滚轮竖向间距(2-4),不设置默认为2,数字越大,间距越大
                        .setLineSpaceMultiplier(2)
                        //设置字号(px),默认14sp
                        .setTextSize(UnitConverter.sp2px(getBaseContext(), 18))
                        //滚轮正常文字的颜色(同时也是顶部Tab的非选中文字颜色)
                        .setTextColorNormal(getResources().getColor(R.color.colorAccent))
                        //滚轮聚焦文字的颜色(同时也是顶部Tab的选中文字颜色)
                        .setTextColorFocus(Color.parseColor("#0069E6"))
                        //设置滚轮分割线颜色(同时也是顶部Tab的选中颜色)
                        .setDividerColor(Color.parseColor("#1E802A"))
                        //设置滚轮分割线宽度比例
                        .setDividerWidthRatio(0.7f)
                        //设置滚轮可见项数量
                        .setVisibleItemCount(7)
                        //设置是否可以循环滚动,默认可以
                        .setCycleable(true)
                        //设置数据
                        .setDatas(d_1)
                        .create()
                        .show(findViewById(R.id.bt_data_picker));
通用联动滚轮模式

相关文章

网友评论

      本文标题:提示窗控件

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