膜拜大神:https://github.com/zyyoona7/EasyPopup
PopupWindow
對(duì) PopupWindow 的封裝枫绅,使得在項(xiàng)目中使用起來更加簡單恐锣、方便衣摩、快捷
項(xiàng)目特性
- 鏈?zhǔn)秸{(diào)用:除了在傳統(tǒng)的 PopupWindow 使用方法之外還加入了更多的方法
- 帶有相對(duì)于 AnchorView 的各個(gè)方位彈出的方法荠瘪,彈出 PopupWindow 更輕松贡蓖、更簡單
- 支持 PopupWindow 彈出時(shí)背景變暗纺酸、指定 ViewGroup 背景變暗嘲碱、設(shè)置變暗顏色等 (API>=18)
- 加入了簡單的生命周期方法金砍,自定義 PopupWindow、處理邏輯更方便悍汛、更清晰
效果圖
[圖片上傳失敗...(image-1d5381-1511419375560)]
倉庫依賴
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. 基本使用
創(chuàng)建 EasyPopup 對(duì)象
可以調(diào)用 setXxx() 方法進(jìn)行屬性設(shè)置捞魁,最后調(diào)用 createPopup() 方法實(shí)現(xiàn)對(duì)PopupWindow的初始化。
private EasyPopup mCirclePop;
mCirclePop = new EasyPopup(this)
.setContentView(R.layout.layout_circle_comment)
.setAnimationStyle(R.style.CirclePopAnim)
//是否允許點(diǎn)擊PopupWindow之外的地方消失
.setFocusAndOutsideEnable(true)
.createPopup();
初始化 View
可以調(diào)用 getView() 方法來獲取 View 對(duì)象离咐。
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("評(píng)論");
mCirclePop.dismiss();
}
});
顯示
相對(duì)于 view 位置顯示
/**
* 相對(duì)anchor view顯示谱俭,適用 寬高不為match_parent
*
* @param anchor
* @param vertGravity 垂直方向的對(duì)齊方式
* @param horizGravity 水平方向的對(duì)齊方式
* @param x 水平方向的偏移
* @param y 垂直方向的偏移
*/
mCirclePop.showAtAnchorView(view, VerticalGravity.CENTER, HorizontalGravity.LEFT, 0, 0);
除了 showAtAnchorView() 方法,內(nèi)部還保留了 showAsDropDown()宵蛀、showAtLocation() 方法昆著。
注意:如果使用 VerticalGravity 和 HorizontalGravity 時(shí),請(qǐng)確保使用之后 PopupWindow 沒有超出屏幕邊界术陶,如果超出屏幕邊界凑懂,VerticalGravity 和 HorizontalGravity 可能無效,從而達(dá)不到你想要的效果梧宫。#4
方位注解介紹
垂直方向?qū)R:VerticalGravity
VerticalGravity.CENTER,//垂直居中
VerticalGravity.ABOVE,//anchor view之上
VerticalGravity.BELOW,//anchor view之下
VerticalGravity.ALIGN_TOP,//與anchor view頂部對(duì)齊
VerticalGravity.ALIGN_BOTTOM,//anchor view底部對(duì)齊
水平方向?qū)R:HorizontalGravity
HorizontalGravity.CENTER,//水平居中
HorizontalGravity.LEFT,//anchor view左側(cè)
HorizontalGravity.RIGHT,//anchor view右側(cè)
HorizontalGravity.ALIGN_LEFT,//與anchor view左邊對(duì)齊
HorizontalGravity.ALIGN_RIGHT,//與anchor view右邊對(duì)齊
2. 彈出 PopupWindow 并伴隨背景變暗
mCirclePop = new EasyPopup(this)
.setContentView(R.layout.layout_circle_comment)
.setAnimationStyle(R.style.CirclePopAnim)
//是否允許點(diǎn)擊PopupWindow之外的地方消失
.setFocusAndOutsideEnable(true)
//允許背景變暗
.setBackgroundDimEnable(true)
//變暗的透明度(0-1)接谨,0為完全透明
.setDimValue(0.4f)
//變暗的背景顏色
.setDimColor(Color.YELLOW)
//指定任意 ViewGroup 背景變暗
.setDimView(viewGroup)
.createPopup();
備注:背景變暗效果只支持 4.2 以上的版本摆碉。
3. 點(diǎn)擊 PopupWindow 之外的地方不讓其消失
mCirclePop = new EasyPopup(this)
.setContentView(R.layout.layout_circle_comment)
.setAnimationStyle(R.style.CirclePopAnim)
//是否允許點(diǎn)擊PopupWindow之外的地方消失,
//設(shè)置為false點(diǎn)擊之外的地方不會(huì)消失脓豪,但是會(huì)響應(yīng)返回按鈕事件
.setFocusAndOutsideEnable(false)
.createPopup();
4. 自定義 PopupWindow
EasyPopup中自定義了三個(gè)生命周期:
- onPopupWindowCreated():PopupWindow 對(duì)象初始化之后調(diào)用
- onPopupWindowViewCreated(View contentView):PopupWindow 設(shè)置完 contentView 和寬高之后調(diào)用
- onPopupWindowDismiss():PopupWindow dismiss 時(shí)調(diào)用
自定義 PopupWindow 需繼承 BaseCustomPopup 抽象類巷帝,實(shí)現(xiàn)內(nèi)部的兩個(gè)抽象方法:
- initAttributes():可以在此方法中設(shè)置 PopupWindow 需要的屬性,該方法在 onPopupWindowCreated() 中調(diào)用
- initViews():在此方法中初始化 view扫夜,該方法在 onPopupWindowViewCreated(View contentView) 中調(diào)用
示例
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) | 設(shè)置 contentView | |
setContentView(@LayoutRes int layoutId) | 設(shè)置 contentView | |
setWidth(int width) | 設(shè)置寬 | |
setHeight(int height) | 設(shè)置高 | |
setAnchorView(View view) | 設(shè)置目標(biāo) view | |
setVerticalGravity(@VerticalGravity int verticalGravity) | 設(shè)置垂直方向?qū)R | |
setHorizontalGravity(@VerticalGravity int horizontalGravity) | 設(shè)置水平方向?qū)R | |
setOffsetX(int offsetX) | 設(shè)置水平偏移 | |
setOffsetY(int offsetY) | 設(shè)置垂直 | |
setAnimationStyle(@StyleRes int animationStyle) | 設(shè)置動(dòng)畫風(fēng)格 | |
getContentView() | 獲取PopupWindow中加載的view | @Nullable |
getContext() | 獲取context | @Nullable |
getPopupWindow() | 獲取PopupWindow對(duì)象 | @Nullable |
dismiss() | 消失 |