前言
无论做什么应用,总是会需要提示窗(loading、确认、子选项选择等等),我已经厌倦了每次需要新的提示窗都要去重新继承一个Dialog/重新折腾一个PopupWindow了,所以搞了一个通用的提示窗,支持自己塞一个自定义的布局进去,也实现了几种常用的布局
示例
地址
使用方法
引用方法
- 在项目的Gradle文件
allprojects {
repositories {
.......
maven { url 'https://jitpack.io' }
}
}
- 在你要用这个控件的模块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));
通用联动滚轮模式
网友评论