Android自定義View之PopupLayout(通用彈出式佈局)

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上的代碼。

5.Github地址

https://github.com/CodingEnding/PopupLayout

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章