[![](https://travis-ci.org/YummyLau/PanelSwitchHelper.svg?branch=master)](https://travis-ci.org/YummyLau/panelSwitchHelper) ![Language](https://img.shields.io/badge/language-java-orange.svg) ![Language](https://img.shields.io/badge/language-kotlin-orange.svg) ![Version](https://img.shields.io/badge/version-1.4.0-blue.svg) ![Size](https://img.shields.io/badge/size-14K-brightgreen.svg) README: [English Doc](https://github.com/YummyLau/PanelSwitchHelper/blob/master/README.md) ### 框架简介 在开发聊天/视频/直播/信息流界面时,希望用户在输入法与功能面板(比如表情面板/更多选项面板等)的切换过程中保持平滑过渡。调研了市场上主流的app效果及实现,实现了一套兼容多场景的输入面板切换框架。目前该框架已测试使用。 ### 原理介绍 * 方案1:在 setSoftInputMode = SOFT_INPUT_ADJUST_RESIZE 的场景下,通过ViewTreeObserver.OnGlobalLayoutListener或者ViewCompat.setOnApplyWindowInsetsListener来获取键盘高度,通过修改onLayout的方式调整输入面板的高度。 * 方案2:在 setSoftInputMode = SOFT_INPUT_ADJUST_NOTHING 的场景下,通过ViewCompat.setWindowInsetsAnimationCallback监听键盘过渡动画,获取实时的键盘高度后,通过修改控件translationY的方式实现。 其中方案2是在1.5.0版本中引入的,可以通过android11KeyboardFeature属性控制是否开启Android 11键盘特性(默认是开启的)。在部分应用场景中Android 11键盘特性无法生效,我们会降级成方案1的方式。 备注:由于Android手机设备碎片化严重,可能会出现部分手机的兼容问题,我们为PanelSwitchLayout提供了两个兼容方法,当你的设备无法正常获取到键盘高度时,你可以尝试实现这两个方法来做兼容。 ```kotlin // 针对Android 11以上开启键盘动画特性,高度获取失败时,对外提供兼容方案 var softInputHeightCalculatorOnStart: ((animation: WindowInsetsAnimationCompat, bounds: WindowInsetsAnimationCompat.BoundsCompat) -> Int)? = null var softInputHeightCalculatorOnProgress: ((insets: WindowInsetsCompat, runningAnimations: MutableList) -> Int)? = null ``` ### 框架优势 * 改进传统使用 `Weight+LinearLayout` 动态更改布局高度适配面板的技术方案,支持多种原生 ViewGroup 容器 * 为了追求更平滑的适配效果,当输入法动态调整高度或动态隐藏导航栏时,功能面板能实时适配 * 为了追求更流畅的切换效果,支持滑动模式,滑动会更流畅,同时也支持固定模式 * 丰富的机型适配,适配 全面屏/刘海屏/挖孔屏/Pad 等非常规 Phone 机型 * 丰富的场景支持,支持 Activity/Fragment/Dialog/PopupWindow,应用到聊天/视频/直播/信息流评论等场景 * 丰富的 API 支持,可自定义内容容器,业务面板,灵活控制面板隐藏,灵活控制切换面板速度 * 支持全屏模式,FullScreen 模式下也能处理面板切换 更多细节可参考 * [场景使用介绍](https://github.com/YummyLau/PanelSwitchHelper/blob/master/README_SENCE-zh.md) * [API 使用指南](https://github.com/YummyLau/PanelSwitchHelper/blob/master/README_API-zh.md) * [库版本更新日志](https://github.com/YummyLau/PanelSwitchHelper/blob/master/README_UPDATE-zh.md) Demo 内容如下 从二维码下载 Demo 默认运行 Androidx 版本,如果需要打开非 Androidx,则在 `Settings.gradle` 中打开 `app` 并在 `gradle.properties` 中关闭 Androidx 配置即可。 ### 使用方法 1. 在模块脚本 `build.gradle` 添加库依赖 1.1、Add it in your root build.gradle at the end of repositories: ```groovy allprojects { repositories { maven { url 'https://jitpack.io' } } } ``` 1.2、Add the dependency ```groovy //1.4.0 版本及后续,仅支持 Androidx dependencies { implementation 'com.github.DSAppTeam:PanelSwitchHelper:v1.5.8' } ``` 2. 在布局文件 Xml 中使用框架提供的容器 ``` ``` 3. 初始化 PanelSwitchHelper 对象,框架会自动收集布局信息。同时在返回键会调时拦截处理即可。 ``` //Activity 场景,在 onStart 方法初始化,其他如 Fragment/Dialog/PopupWindow 参考 Demo private PanelSwitchHelper mHelper; @Override protected void onStart() { super.onStart(); if (mHelper == null) { mHelper = new PanelSwitchHelper.Builder(this) .addKeyboardStateListener { onKeyboardChange { //可选实现,监听输入法变化 } } .addEditTextFocusChangeListener { onFocusChange { _, hasFocus -> //可选实现,监听输入框焦点变化 } } .addViewClickListener { onClickBefore { //可选实现,监听触发器的点击 } } .addPanelChangeListener { onKeyboard { //可选实现,输入法显示回调 } onNone { //可选实现,默认状态回调 } onPanel { //可选实现,面板显示回调 } onPanelSizeChange { panelView, _, _, _, width, height -> //可选实现,输入法动态调整时引起的面板高度变化动态回调 } } .addContentScrollMeasurer { //可选,滑动模式下,可以针对内容面板内的view,定制滑动距离,默认滑动距离为 defaultDistance getScrollDistance { defaultDistance -> defaultDistance - 200 } getScrollViewId { R.id.recycler_view } } .addPanelHeightMeasurer { //可选 用于设置未获取输入法高度前面板的高度,如果不设置则默认以框架内高度为主 synchronizeKeyboardHeight { false } // 设置面板高度是否和键盘高度同步 getTargetPanelDefaultHeight { DisplayUtils.dip2px(this@DefaultHeightPanelActivity,400f)} getPanelTriggerId { R.id.add_btn } } .contentScrollOutsideEnable(true) //可选,默认为true .logTrack(true) //可选,默认false,是否开启log信息输出 .build(true) //可选,默认false,是否默认打开输入法 } } @Override public void onBackPressed() { //用户按下返回键的时候,如果显示面板,则需要隐藏 if (mHelper != null && mHelper.hookSystemBackForHindPanel()) { return; } super.onBackPressed(); } ``` ### 期望 编写该项目只是希望能提高日常开发的效率,专注于处理业务。如果更好的做法或者意见建议,欢迎写信到 yummyl.lau@gmail.com 。 也可以微信“lym_llllll” 添加微信进群反馈。 如果框架对你有帮助,可安利给身边的伙伴,每一个 star 都是对框架付出的肯定。