Android自定义View之PopupLayout(通用弹出式布局)

Android自定义View:PopupLayout详解
本文介绍了Android自定义View组件PopupLayout,它是一个通用的弹出布局库,支持从五个方向弹出,并具有圆角和动画效果。内容包括:初始化、显示位置、关闭方式、尺寸限制、监听器的使用方法以及实现思路。同时提供了Github仓库链接以查看详细代码和更多示例。

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值