膜拜大神:https://github.com/zyyoona7/EasyPopup
image.png
PopupWindow
對 PopupWindow 的封裝,使得在項目中使用起來更加簡單、方便、快捷
項目特性
- 鏈式調用:除了在傳統的 PopupWindow 使用方法之外還加入了更多的方法
- 帶有相對于 AnchorView 的各個方位彈出的方法,彈出 PopupWindow 更輕松、更簡單
- 支持 PopupWindow 彈出時背景變暗、指定 ViewGroup 背景變暗、設置變暗顏色等 (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. 基本使用
創建 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() | 消失 |