Android-开源通用弹窗的封装CommonPopupWind
终于也是自己封装一些东西了,不管烂不烂,还是自我鼓励了一把!(之前学maven发布也是这个目的)
开源地址: FanChael/CommonPopupWindow
弹窗效果如下:
image image image image@tip后面会逐渐完善吧,目前先暂停一小段时间的更新。(基本使用可以了,后面打算用其中的更新弹窗模块+rx家族+json->做一个App更新的框架,新的项目搭建起来就快多了);
@tip注册登录弹窗每家样式不一样,而且目前主流的是页面式的,就是全屏的那种,所以注册登录如果有比较原生的国外的样式,打算借鉴一下
@tip再加强下自身的学习,加强下设计模式,加强下源码,加强下他人好的框架的学习,要加强的东西忒多了!
下面就简单介绍下使用方式吧(新建一个工程试试):
引入工程:
//未引入记得引入 - 注册登录弹窗需要
implementation 'com.android.support:design:28.0.0'
//1.0.4 自定义+分享弹窗+注册登录弹窗+更新弹窗
implementation 'com.hl:poplibrary:1.0.4'
1. 自定义布局走起
1.1 比如我们之前用Spinner搞得下拉列表
image其中布局为:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/deep_gray"
tools:context=".MainActivity">
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:dropDownVerticalOffset="50dp"
android:background="@drawable/spinner_bg_shape"
android:entries="@array/spingarr"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
spinner_bg_shape.xml为:(其他都是颜色值,随便设置就好)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="6dp" />
<stroke
android:width="2dp"
android:color="@color/gray" />
<solid android:color="#00ffffff" />
</shape>
1.2 现在替换为我们的定义的通用弹窗来搞试试
1.2.1 测试布局修改为activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/deep_gray"
tools:context=".MainActivity">
<TextView
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:background="@drawable/spinner_bg_shape"
android:onClick="popTest"
android:text="假北京"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
1.2.2 弹窗布局为 pop_address.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<TextView
android:id="@+id/pa_haidianTv"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="海淀" />
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="昌平" />
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="朝阳" />
</LinearLayout>
1.2.3 调用(内部做了说明,应该不是难理解)
/**
* 弹窗测试
* @param view
*/
public void popTest(View view) {
///< 动画BasePopView.ANIMATION _animation可以传null
///< 可以选择调用无参数bOutsideTouchable、_backColor的方法(默认点击外部不消失)
///< 点击事件回调_onClickListenner可以传null
BasePop.Builder builder = BasePopView.show(this,
view, R.layout.pop_address,
ScreenUtil.getScreenW(this), 0, ///< 0 - 表示高度内容包裹 -1 - 表示屏幕高度
true, -1,
BasePopView.ANIMATION.SCALE, ///< 方位显示方式只支持缩放动画->BasePopView.ANIMATION.SCALE
new OnEventListenner.OnBaseClickListenner() {
@Override
public void onClick(View view) {
///< 包含了跟布局下第一层子控件的点击事件(多层嵌套暂时未做处理,考虑的是作为一个弹窗没有那么复杂)
switch (view.getId()) {
case R.id.pa_haidianTv:
Toast.makeText(MainActivity.this, "点击了海淀", Toast.LENGTH_SHORT).show();
break;
}
}
}, BasePopView.GRAVITY.LEFTTOP_TO_LEFTBOTTOM);
}
1.2.4 显示效果如下 - - 其他显示效果,可以参考FanChael/CommonPopupWindow
image2 分享弹窗(或许会被别人用到)FanChael/CommonPopupWindow
提供两种常用的分享弹窗样式(其中第二种仿tecent样式)
默认提供四种常规分享平台按钮+一个复制链接按钮(wx,circle,qq,sina,link)
提供了从上至下,从下至上两种出场方式
分享图标超过5个的情况下,可以选择采用水平滑动,或者网格方式进行展示;低于五个会做均分
2.1 默认常规分享调用
///< 点击事件回调
OnEventListenner.OnShareClickListenner onShareClickListenner = new OnEventListenner.OnShareClickListenner() {
@Override
public void onClick(View view, int pos) {
Toast.makeText(MainActivity.this, "pos=" + pos, Toast.LENGTH_SHORT).show();
}
};
///< 不提供分享资源的情况,默认提供了四种常规分享平台按钮+一个复制链接按钮/采用的是水平展示(条目过多的情况下,可以左右滑动)
BasePop.Builder builder = SharePopView.showShare(this, view,
null, null,
BasePopView.SIMPLE_GRAVITY.FROM_BOTTOM,
SharePopView.SHOW_TYPE.HORIZON,
onShareClickListenner);
image
2.2 提供分享资源(仿tecent的样式调用)
List<String> _share2Name = new ArrayList<>();
_share2Name.add("华为");
_share2Name.add("阿里");
_share2Name.add("小米");
_share2Name.add("毛豆");
_share2Name.add("无聊");
_share2Name.add("华为");
_share2Name.add("阿里");
_share2Name.add("小米");
_share2Name.add("毛豆");
_share2Name.add("无聊");
List<Integer> _share2Icon = new ArrayList<>();
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
_share2Icon.add(R.drawable.share_qq);
///< 点击事件回调
OnEventListenner.OnShareClickListenner onShareClickListenner = new OnEventListenner.OnShareClickListenner() {
@Override
public void onClick(View view, int pos) {
Toast.makeText(MainActivity.this, "pos=" + pos, Toast.LENGTH_SHORT).show();
}
};
///< 不提供分享资源的情况,默认提供了四种常规分享平台按钮+一个复制链接按钮/采用的是水平展示(条目过多的情况下,可以左右滑动)
BasePop.Builder builder = SharePopView.showShare(this, view,
_share2Name, _share2Icon,
BasePopView.SIMPLE_GRAVITY.FROM_BOTTOM,
SharePopView.SHOW_TYPE.HORIZON,
onShareClickListenner);
image
image
别的像更新弹窗可以参考相关文档 FanChael/CommonPopupWindow
剩下的就参考教程来就好!小萌新的新项目用了。小白也算是兑现了之前的计划“通用弹窗计划”,当然无知的地方还在多,错的地方也还多,只有努力了....
其他学习相关
另外关于Dialog, DialogFragment, PopupWindow比较 Dialog, DialogFragment, PopupWindow比较 - 可以参考下,底部有很多相关解读
官方目前推荐采用DialogFragment创建对话框https://developer.android.google.cn/reference/android/app/DialogFragment - 其中比较重要的一点就是声明周期的管理(更方便的做适配) - 当然不一定都要用这个替代以前的。有些知名app也是某些情况下采用了alertDialog,都没做什么样式(感觉还是好看,更主题颜色很搭)
这样想的话,小白的整个通用弹窗貌似还有很多情况没做测试以及处理(比如横竖屏切换...后续还得更完善)
其他相关搜集...多看看也没啥坏处
image