EasyPopup
EasyPopup
PopupWindow
对 PopupWindow 的封装,使得在项目中使用起来更加简单、方便、快捷
项目特性
- 链式调用:除了在传统的 PopupWindow 使用方法之外还加入了更多的方法
- 带有相对于 AnchorView 的各个方位弹出的方法,弹出 PopupWindow 更轻松、更简单
- 支持 PopupWindow 弹出时背景变暗、指定 ViewGroup 背景变暗、设置变暗颜色等 (API>=18)
- 加入了简单的生命周期方法,自定义 PopupWindow、处理逻辑更方便、更清晰
效果图
仓库依赖
Step 1. Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
//...
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
compile 'com.github.zyyoona7:EasyPopup:VERSION_CODE'
}
最新的VERSION_CODE
使用
1. 基本使用
创建 EasyPopup 对象
可以调用 setXxx() 方法进行属性设置,最后调用 createPopup() 方法实现对PopupWindow的初始化。
private EasyPopup mCirclePop;
mCirclePop = new EasyPopup(this)
.setContentView(R.layout.layout_circle_comment)
.setAnimationStyle(R.style.CirclePopAnim)
//是否允许点击PopupWindow之外的地方消失
.setFocusAndOutsideEnable(true)
.createPopup();
初始化 View
可以调用 getView() 方法来获取 View 对象。
TextView tvZan=mCirclePop.getView(R.id.tv_zan);
TextView tvComment=mCirclePop.getView(R.id.tv_comment);
tvZan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtils.showShort("赞");
mCirclePop.dismiss();
}
}); tvComment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtils.showShort("评论");
mCirclePop.dismiss();
}
});
显示
相对于 view 位置显示
/**
* 相对anchor view显示,适用 宽高不为match_parent
*
* @param anchor
* @param vertGravity 垂直方向的对齐方式
* @param horizGravity 水平方向的对齐方式
* @param x 水平方向的偏移
* @param y 垂直方向的偏移
*/
mCirclePop.showAtAnchorView(view, VerticalGravity.CENTER, HorizontalGravity.LEFT, 0, 0);
除了 showAtAnchorView() 方法,内部还保留了 showAsDropDown()、showAtLocation() 方法。
注意:如果使用 VerticalGravity 和 HorizontalGravity 时,请确保使用之后 PopupWindow 没有超出屏幕边界,如果超出屏幕边界,VerticalGravity 和 HorizontalGravity 可能无效,从而达不到你想要的效果。#4
方位注解介绍
垂直方向对齐:VerticalGravity
VerticalGravity.CENTER,//垂直居中
VerticalGravity.ABOVE,//anchor view之上
VerticalGravity.BELOW,//anchor view之下
VerticalGravity.ALIGN_TOP,//与anchor view顶部对齐
VerticalGravity.ALIGN_BOTTOM,//anchor view底部对齐
水平方向对齐:HorizontalGravity
HorizontalGravity.CENTER,//水平居中
HorizontalGravity.LEFT,//anchor view左侧
HorizontalGravity.RIGHT,//anchor view右侧
HorizontalGravity.ALIGN_LEFT,//与anchor view左边对齐
HorizontalGravity.ALIGN_RIGHT,//与anchor view右边对齐
2. 弹出 PopupWindow 并伴随背景变暗
mCirclePop = new EasyPopup(this)
.setContentView(R.layout.layout_circle_comment)
.setAnimationStyle(R.style.CirclePopAnim)
//是否允许点击PopupWindow之外的地方消失
.setFocusAndOutsideEnable(true)
//允许背景变暗
.setBackgroundDimEnable(true)
//变暗的透明度(0-1),0为完全透明
.setDimValue(0.4f)
//变暗的背景颜色
.setDimColor(Color.YELLOW)
//指定任意 ViewGroup 背景变暗
.setDimView(viewGroup)
.createPopup();
备注:背景变暗效果只支持 4.2 以上的版本。
3. 点击 PopupWindow 之外的地方不让其消失
mCirclePop = new EasyPopup(this)
.setContentView(R.layout.layout_circle_comment)
.setAnimationStyle(R.style.CirclePopAnim)
//是否允许点击PopupWindow之外的地方消失,
//设置为false点击之外的地方不会消失,但是会响应返回按钮事件
.setFocusAndOutsideEnable(false)
.createPopup();
4. 自定义 PopupWindow
EasyPopup中自定义了三个生命周期:
- onPopupWindowCreated():PopupWindow 对象初始化之后调用
- onPopupWindowViewCreated(View contentView):PopupWindow 设置完 contentView 和宽高之后调用
- onPopupWindowDismiss():PopupWindow dismiss 时调用
自定义 PopupWindow 需继承 BaseCustomPopup 抽象类,实现内部的两个抽象方法:
- initAttributes():可以在此方法中设置 PopupWindow 需要的属性,该方法在 onPopupWindowCreated() 中调用
- initViews():在此方法中初始化 view,该方法在 onPopupWindowViewCreated(View contentView) 中调用
示例
public class ComplexPopup extends BaseCustomPopup {
private static final String TAG = "ComplexPopup"; private Button mOkBtn;
private Button mCancelBtn; protected ComplexPopup(Context context) {
super(context);
} @Override
protected void initAttributes() {
setContentView(R.layout.layout_complex,
ViewGroup.LayoutParams.MATCH_PARENT, SizeUtils.dp2px(300));
setFocusAndOutsideEnable(false)
.setBackgroundDimEnable(true)
.setDimValue(0.5f);
//setXxx()
//...
} @Override
protected void initViews(View view) {
mOkBtn = getView(R.id.btn_ok);
mCancelBtn = getView(R.id.btn_cancel); mOkBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
}); mCancelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
} }
mComplexPopup = new ComplexPopup(this);
mComplexPopup.setDimView(mComplexBgDimView)
.createPopup();
5. 其他方法介绍
方法名 | 作用 | 备注 |
---|---|---|
setContentView(View contentView) | 设置 contentView | |
setContentView(@LayoutRes int layoutId) | 设置 contentView | |
setWidth(int width) | 设置宽 | |
setHeight(int height) | 设置高 | |
setAnchorView(View view) | 设置目标 view | |
setVerticalGravity(@VerticalGravity int verticalGravity) | 设置垂直方向对齐 | |
setHorizontalGravity(@VerticalGravity int horizontalGravity) | 设置水平方向对齐 | |
setOffsetX(int offsetX) | 设置水平偏移 | |
setOffsetY(int offsetY) | 设置垂直 | |
setAnimationStyle(@StyleRes int animationStyle) | 设置动画风格 | |
getContentView() | 获取PopupWindow中加载的view | @Nullable |
getContext() | 获取context | @Nullable |
getPopupWindow() | 获取PopupWindow对象 | @Nullable |
dismiss() | 消失 |
感谢
RelativePopupWindow
CustomPopwindow
android-simple-tooltip
EasyDialog
Android弹窗_PopupWindow详解
License
Copyright 2017 zyyoona7
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
EasyPopup的更多相关文章
随机推荐
- Urozero Autumn 2016. UKIEPC 2016
B. Build a Boat 首先求出每块船舱的面积$S$,然后进行$m$次二分,得到每个切割线的位置. 为了计算某个切割线形成的区域的面积,需要将多边形整理成上边界和下边界,分别二分出断点位置,中 ...
- fastjson 使用教程
fastjson 是阿里的开源项目,具网上的说法 fastjson 的解析速度是 Gson 的6倍,体积小,而且开源. 项目地址: https://github.com/alibaba/fastjso ...
- 暗之的锁链 [COGS2434] [树上差分]
Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径.另外,Dark ...
- css3 学习 重点 常用
1 -webkit- -moz- -o-浏览器兼容 2 box-sizing:border-box; 两个近乎一样的div一样的样式 平分一个div 定义:属性允许您以确切的方式定义适 ...
- python之类
1 初始类 1 声明类 (和声明函数很相似) 类的定义格式 class 类名: '类的文档字符串' 类体 2 创建一个类: class Data: pass Python编程中习惯类名使用单数单词并且 ...
- Eclipse/myEclipse 代码提示/自动提示/自动完成设置
设置eclipse/myEclipse代码提示可以方便开发者,不用在记住拉杂的单词,只用打出首字母,就会出现提示菜单.如同dreamweaver一样方便. 1.菜单window->Prefere ...
- .Net转Java.04.踩到switch的坑
今天线上有个NullPointerException 的异常,我翻了一下代码,抛异常的竟然是switch语句 我有种不祥的预感,本地做了实验 结果是 Java的switch如果传入null值,会抛出 ...
- GoAccess日志分析工具
1.1 GoAccess简介 GoAccess是一个非常良心的开源软件,它的良心之处体现在如下方面: 1)安装简单: 2)操作容易: 3)界面酷炫: GoAccess 官网 https://goacc ...
- c# mvc 封装返回对象
将所有返回JsonContent对象进行再次封装 public class ResultFilterAttribute : System.Web.Mvc.ActionFilterAttribute { ...
- NOIP2010普及组 导弹拦截
导弹拦截 OJ地址: https://www.luogu.org/problemnew/show/P1158 http://codevs.cn/problem/1128/ 题目描述 Descrip ...