1.概述
PopupLayout是通用彈出佈局輔助庫,允許開發者從頂部、底部、左側、右側和中心這五個位置彈出自己指定的View,此外還提供圓角和動畫特性。
2.效果預覽
PS:本庫的更多效果可以參考Github上的Gif演示(Github地址)
3.基本用法
Gradle配置
//根項目下的build.gradle
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
//主項目下的build.gradle
dependencies {
implementation 'com.github.CodingEnding:PopupLayout:v1.0'
}
基本使用
PopupLayout的使用非常簡單,只需要執行以下兩步:
1.初始化PopupLayout
通過調用靜態方法init初始化PopupLayout。這個方法有兩個參數:第一個參數是Context對象,第二個參數代表彈出佈局的內容,可以將layout資源Id或者View對象作爲參數傳入,如下所示:
//1.使用layout資源Id作爲彈出佈局的內容
PopupLayout popupLayout=PopupLayout.init(MainActivity.this, R.layout.layout_left);
//2.使用View作爲彈出佈局的內容
View view=View.inflate(MainActivity.this,R.layout.layout_bottom_menu,null);
PopupLayout popupLayout=PopupLayout.init(MainActivity.this,view);
2.在指定位置顯示彈出佈局
PopupLayout可以從屏幕頂部、底部、左側、右側和中心彈出(默認從底部彈出),如下所示:
//從左側彈出
popupLayout.show(PopupLayout.POSITION_LEFT);
//默認從底部彈出
popupLayout.show();
position的可選值:
- POSITION_LEFT
- POSITION_RIGHT
- POSITION_CENTER
- POSITION_TOP
- POSITION_BOTTOM
關閉彈出佈局
點擊彈出佈局之外的區域,PopupLayout會被自動關閉。當然,也可以通過調用dismiss或hide方法手動關閉。這兩個方法的區別在於hide只是隱藏彈出佈局,並不會釋放資源;而dismiss會銷燬彈出佈局並釋放資源。通常情況下,建議使用dismiss方法。
public void dismiss()
public void hide()
注意:在Activity退出時必須使用dismiss方法銷燬彈出佈局,釋放資源。
限制彈出佈局的大小
默認情況下,PopupLayout會根據不同的彈出位置自動適配彈出佈局的大小。具體而言,如果從頂部/底部彈出,寬度爲MATCH_PARENT,高度爲WRAP_CONTENT;如果從左側/右側彈出,寬度爲WRAP_CONTENT,高度爲MATCH_PARENT;如果從中心彈出,寬度爲WRAP_CONTENT,高度爲WRAP_CONTENT。
當然,PopupLayout也提供了setHeight和setWidth兩個方法用於手動設置彈出佈局的大小。這兩個方法原型如下:
/**
* 設置彈出佈局的高度
* @param height 高度
* @param dpMode 是否以dp爲單位
*/
public void setHeight(int height,boolean dpMode)
/**
* 設置彈出佈局的寬度
* @param width 寬度
* @param dpMode 是否以dp爲單位
*/
public void setWidth(int width,boolean dpMode)
注意:這兩個方法必須要在調用show方法之前使用纔有效。
相關方法
方法名 | 返回值 | 說明 |
---|---|---|
static init(Context context,@LayoutRes int contentLayoutId) | PopupLayout | 初始化彈出佈局 |
static init(Context context,View contentView) | PopupLayout | 初始化彈出佈局 |
show(int position) | void | 從指定位置顯示彈出佈局 |
show() | void | 默認從底部顯示彈出佈局 |
dismiss() | void | 隱藏彈出佈局(同時會銷燬彈出佈局,釋放資源),建議使用 |
hide() | void | 隱藏彈出佈局(不會銷燬彈出佈局),不會觸發DismissListener |
setUseRadius(boolean useRadius) | void | 是否使用圓角特性(默認使用) |
setHeight(int height,boolean dpMode) | void | 設置彈出佈局的高度 |
setWidth(int width,boolean dpMode) | void | 設置彈出佈局的寬度 |
setDismissListener(DismissListener dismissListener) | void | 設置Dismiss監聽器(在彈出佈局消失時觸發) |
監聽器
PopupLayout允許使用者監聽彈出佈局的消失事件,只需要爲PopupLayout設置DismissListener即可,如下所示:
PopupLayout popupLayout=PopupLayout.init(MainActivity.this, R.layout.layout_bottom);
popupLayout.setDismissListener(new PopupLayout.DismissListener() {
@Override
public void onDismiss() {
Toast.makeText(MainActivity.this,"彈出窗口關閉",Toast.LENGTH_SHORT).show();
}
});//添加監聽器
4.實現思路
簡單來說,PopupLayout使用Dialog的方式來實現彈出自定義View。在本庫中有一個自定義的Dialog子類,它的佈局文件中主要是一個FrameLayout。外界傳入的View(layout資源Id會被解析爲View對象)最終都會被添加到這個FrameLayout中。
PopupLayout實際上是一個輔助類,負責根據外界調用的方法改變Dialog的具體配置信息,如彈出位置(Window的gravity屬性)、窗體大小(LayoutParams)、設置監聽器等。
此外,本庫還針對不同的彈出位置,爲Dialog提供了不同的佈局動畫,以及爲佈局提供了可選的圓角特性等。
更多的細節可以參考Github上的代碼。