最新要闻
- 【环球播资讯】小鹏股价暴跌、交付量惨淡 何小鹏专访回应:未来会这么做
- 全球动态:全球首个!婴幼儿视功能损伤手机智能筛查系统面世
- 撸猫手感 绿联iPhone 12-14系列液态硅胶保护壳9.9元起
- 天天快看点丨海淘不香了!日版Xbox主机涨价将近260元
- 天天速递!全国首烧?疑似红旗E-HS9充电时起火 现场黑烟弥漫
- 瑾娘为什么要杀华裳?瑾娘为什么假扮巽芳?
- 爱在旅途大结局是什么?爱在旅途剧情介绍
- 法国属于西欧还是北欧?南欧包括哪些国家?
- 荷兰为什么被称为水之国?荷兰水之国的资料简介
- 长宽高的英文缩写分别是什么?长宽高怎么算平方?
- 环球速讯:工信部明天起优化调整微波频率 为5G/6G预留频谱资源
- 【独家】美国下手真狠!沃尔沃在美被罚8.7亿元 史上最大
- 快消息!APP竟比线下贵一倍还多 有电影院劝说观众退订淘票票
- 【世界快播报】提车1周 一特斯拉高速上行驶时方向盘脱落:维修还被收费
- 每日速读!全球最大游戏展E3辉煌不在:微软索尼任天堂“御三家”将集体缺席
- 今日热门!元宵节将至!元宵夜将出现年度最小满月
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天快消息!Android 软键盘丝滑切换(一)
在开发app中,软键盘弹出会有卡顿,闪一下的现象,会影响体验效果。为了实现微信软键盘与表情面板流畅的切换效果,查看了好多例子,查阅的很多资料,换了几种实现方式,都达不到流畅切换的效果,最终结合资料,参考网上的很多例子实现了想要的效果。(由于Demo中代码部分为Java代码,所以文中代码也由Kotlin与Java组成)Demo地址:https://github.com/xiaoyu00/KeyboardDemo
(资料图)
效果图
实现思路
在manifest android:windowSoftInputMode属性提供了系统自带的键盘弹出界面变化的几种方式,但都达不到流畅切换效果,更别说更复杂的微信键盘切换了,所以我们不用系统的方式,自己实现。首先要实时获取到软键盘弹出时的属性:是否弹出,动画执行过程,高度等;然后在界面加载完成后计算带表情面板布局的高度;最后围绕键盘弹出收回的过程中,在键盘属性变化时对整个布局做平移处理。
实现
一、键盘监听
键盘的变化监听是整个实现的核心,Android手机的键盘所有属性是直接获取不到的。监听键盘变化只能用其它方式,网上有几种方方法,我这选择的是根view Insets监听方式(实现OnApplyWindowInsetsListener接口,设置ViewCompat.setWindowInsetsAnimationCallback)。
1.自定义RootViewDeferringInsetsCallback继承WindowInsetsAnimationCompat.Callback实现OnApplyWindowInsetsListener接口
public class RootViewDeferringInsetsCallback extends WindowInsetsAnimationCompat.Callback implements OnApplyWindowInsetsListener {
private View view; private WindowInsetsCompat lastWindowInsets; private boolean deferredInsets = false; private int persistentInsetTypes; private int deferredInsetTypes; private boolean isPadding = false;
...//构造方法
@Override public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat windowInsets) { view = v; lastWindowInsets = windowInsets; if (isPadding) { int types; if (deferredInsets) { types = deferredInsetTypes; } else { types = persistentInsetTypes | deferredInsetTypes; } Insets typeInsets = windowInsets.getInsets(types); v.setPadding(typeInsets.left, typeInsets.top, typeInsets.right, typeInsets.bottom); } return WindowInsetsCompat.CONSUMED; }
@Override public void onPrepare(@NonNull WindowInsetsAnimationCompat animation) { if ((animation.getTypeMask() & deferredInsetTypes) != 0) { deferredInsets = true; } }
@NonNull @Override public WindowInsetsCompat onProgress(@NonNull WindowInsetsCompat insets, @NonNull ListrunningAnimations) { return insets; }
@Override public void onEnd(@NonNull WindowInsetsAnimationCompat animation) { if (deferredInsets && (animation.getTypeMask() & deferredInsetTypes) != 0) { deferredInsets = false; if (lastWindowInsets != null && view != null) { ViewCompat.dispatchApplyWindowInsets(view, lastWindowInsets); } } }
}
2.定义KeyBoardListener接口
public interface KeyBoardListener { void onAnimStart(int moveDistance); void onAnimDoing(int offsetX,int offsetY); void onAnimEnd();}
3.自定义KeyBoardInsetsCallBack继承RootViewDeferringInsetsCallback
public class KeyBoardInsetsCallBack extends RootViewDeferringInsetsCallback { public static final int KEYBOARD_TYPE = WindowInsetsCompat.Type.ime(); public static final int SYSTEM_BAR_TYPE = WindowInsetsCompat.Type.systemBars(); private KeyBoardListener keyboardListener; public KeyBoardInsetsCallBack(int dispatchMode, KeyBoardListener keyboardListener) { super(dispatchMode); this.keyboardListener = keyboardListener; } public KeyBoardInsetsCallBack(KeyBoardListener keyboardListener) { this(DISPATCH_MODE_STOP, keyboardListener); } @NonNull @Override public WindowInsetsAnimationCompat.BoundsCompat onStart(@NonNull WindowInsetsAnimationCompat animation, @NonNull WindowInsetsAnimationCompat.BoundsCompat bounds) { keyboardListener.onAnimStart(bounds.getUpperBound().bottom - bounds.getLowerBound().bottom);//计算键盘弹出高度 return super.onStart(animation, bounds); } @NonNull @Override public WindowInsetsCompat onProgress(@NonNull WindowInsetsCompat insets, @NonNull ListrunningAnimations) { Insets typesInset = insets.getInsets(KEYBOARD_TYPE); Insets otherInset = insets.getInsets(SYSTEM_BAR_TYPE); Insets subtract = Insets.subtract(typesInset, otherInset); Insets diff = Insets.max(subtract, Insets.NONE); keyboardListener.onAnimDoing(diff.left - diff.right, diff.top - diff.bottom); return insets; } @Override public void onEnd(@NonNull WindowInsetsAnimationCompat animation) { keyboardListener.onAnimEnd(); }}
4.最后在Activity中界面加载完成后添加键盘监听
val keyBoardInsetsCallBack =KeyBoardInsetsCallBack(object : KeyBoardListener { override fun onAnimStart(moveDistance: Int) { ... } override fun onAnimDoing(offsetX: Int, offsetY: Int) { ... } override fun onAnimEnd() { ... } }) ViewCompat.setWindowInsetsAnimationCallback(window.decorView, keyBoardInsetsCallBack)
这样就完成了键盘弹出收回过程的监听。
二、计算并设置View大小
在界面加载完成后计算View高度,contentLayout为根Layout
contentLayout.viewTreeObserver .addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { contentLayout.viewTreeObserver.removeOnGlobalLayoutListener(this) calculationLayoutSize() initKeyBoardListener() } })
private fun calculationLayoutSize() { val layoutParams = contentLayout.layoutParams as FrameLayout.LayoutParams val layoutParams2 = listLayout.layoutParams as LinearLayout.LayoutParams val cHeight: Int = contentLayout.height PANEL_HEIGHT=(cHeight*0.45).toInt()//PANEL_HEIGHT为表情面板高度 layoutParams2.height = cHeight listLayout.layoutParams = layoutParams2//listlayout为表情面板上面内容layout layoutParams.height = cHeight + PANEL_HEIGHT contentLayout.layoutParams = layoutParams }
整个布局xml
//滑动列表 ... // 输入框
接下来在键盘弹出收起过程中对根布局做平移处理。
-
速看:OpenYurt v1.2 新版本深度解读(一): 聚焦边云网络优化
云原生边缘计算智能开源平台CNCFOpenYurt于近期发布了v1 2版本。OpenYurt是业界首个对云原生体系无侵入...
来源: 天天快消息!Android 软键盘丝滑切换(一)
天天看点:视频发布失败原因不好找?火山引擎数智平台这款产品能帮忙
速看:OpenYurt v1.2 新版本深度解读(一): 聚焦边云网络优化
【环球播资讯】小鹏股价暴跌、交付量惨淡 何小鹏专访回应:未来会这么做
全球动态:全球首个!婴幼儿视功能损伤手机智能筛查系统面世
撸猫手感 绿联iPhone 12-14系列液态硅胶保护壳9.9元起
天天快看点丨海淘不香了!日版Xbox主机涨价将近260元
天天速递!全国首烧?疑似红旗E-HS9充电时起火 现场黑烟弥漫
瑾娘为什么要杀华裳?瑾娘为什么假扮巽芳?
爱在旅途大结局是什么?爱在旅途剧情介绍
法国属于西欧还是北欧?南欧包括哪些国家?
荷兰为什么被称为水之国?荷兰水之国的资料简介
长宽高的英文缩写分别是什么?长宽高怎么算平方?
oppor7手机版本低怎么升级?oppo r7手机参数
复工第一天:请马上卸载这个恶心的软件!!!
全球看热讯:python-paramiko操作的封装
无法定位序数是什么意思?无法定位序数怎么解决?
打印机驱动在电脑哪里找?如何卸载打印机驱动?
无线适配器或访问点有问题是什么意思?无线适配器或访问点有问题怎么处理?
魅族手机怎么样?魅族手机锁屏密码忘了怎么解开?
环球速讯:工信部明天起优化调整微波频率 为5G/6G预留频谱资源
【独家】美国下手真狠!沃尔沃在美被罚8.7亿元 史上最大
快消息!APP竟比线下贵一倍还多 有电影院劝说观众退订淘票票
【世界快播报】提车1周 一特斯拉高速上行驶时方向盘脱落:维修还被收费
每日速读!全球最大游戏展E3辉煌不在:微软索尼任天堂“御三家”将集体缺席
波司登云原生微服务治理探索
今日热门!元宵节将至!元宵夜将出现年度最小满月
世界实时:侄子出演叔叔 MJ传记片年内开拍
【速看料】女子抱娃人肉占车位 还移走路障为自家车开路 结局引人舒适
世界讯息:西安阿房宫站将更名西安西站:原西站不够西
天天观热点:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元大促
焦点要闻:读Java8函数式编程笔记06_Lambda表达式编写并发程序
【全球新要闻】全网影视免费看,最新电影、电视剧免广告免VIP观看,只要你能搜到的,统统都能看,《狂飙》、《三体》追剧神器,时刻掌握最新剧集,无需安装,使用简单,
被苹果踢出供应链两年了 欧菲光仍未缓过劲:2022巨亏40多亿
精选!疯狂玩梗!强盛集团孙红雷直播被买鱼刷屏
焦点短讯!A卡很难追 游戏开发者越来越喜欢DLSS:理由离谱 弥补D加密损失
环球即时看!2023春节档爆发:复苏满座与极端的粉黑大战
每日消息!关于桌面上一万多个图标
刘慈欣:30年前拍不成《流浪地球2》 投资人不信中国有太空电梯
世界快看:老外幸福感暴降:英国近半年轻人担心收入永远不够养家
别贪速度快!SSD选什么接口更适合你?
《敢死队2》观后感
环球快报:VUEX 使用学习六 : modules
国产奋起!26557款软件力挺飞腾CPU
最新资讯:三大航空公司2022年合计预亏逾1000亿元!三大因素、东航最惨
环球观察:三亚凤凰机场出现滚滚浓烟?机场回应:暂无影响
快消息!这次过年 网吧终于活过来了!和以前完全不一样
河南矿山回应3名员工各领500万奖金:有人销售额超3亿
【环球报资讯】每个前端程序员都应该知道的10个Chrome扩展
刘慈欣:电影《流浪地球2》是原创而非小说改编 全方位超越第一部
今日聚焦!广东一男子打球6天后发现头顶卡对手2颗牙:网友神评论
焦点热议:索尼真有你的:背后给微软捅刀子
Acw 170.加成序列
精彩看点:React组件的使用
【全球独家】理想L5车型首次公布:不是SUV 价格坚守20万以上
每日热讯!最新显卡天梯榜公布:前十NVIDIA占五席!RTX 4090断层第一
全球新动态:杭州岳庙秦桧像被砸烂9次 游客仍不解气:专家称泄愤不应暴力
世界资讯:腾讯游戏春节7天吸金超4.5亿:《王者荣耀》独占一半 稳坐第一
世界信息:一加平板来了:Star Orbit金属打造 CNC一体机身
佳能2022年营收破4万亿日元 相机收入暴增 完全不惧手机蚕食
画面有点上头!男子扛铁板狂砸秦桧雕像:《满江红》带火景区热度
赚了!科学家在南极发现罕见大陨石:7.7公斤
全球消息!【Python】爬虫实战-基于代理池的高并发爬虫
焦点快看:rust写一个im聊天服务
全球看点:打破日本垄断!OLED关键材料FMM首次国产
环球今日讯!R星今日正式入驻B站!网友“花式”催更《GTA6》
全球观天下!显卡、主板返修排行:戴尔居然完美第一!AMD极度尴尬
环球简讯:神舟十五号航天员准备首次出舱!期待“感觉良好”
天天资讯:真我GT Neo5明天官宣 网友:赢麻了
每日视点!国产PCIe 4.0硬盘天花板 致态TiPro7000 1TB到手699元
《流浪地球2》热映 张朝阳称引力弹弓真实存在:美国航天器经历过
全球视点!比亚迪2022年业绩预告出炉:净利润同比暴增超450%
世界今热点:65寸电视不到2000元 LCD跌成白菜价 面板一哥京东方2022利润大跌70%
荣耀Magic5系列定档:2月27日MWC巴塞罗那见
Java中23种设计模式介绍和应用场景总结
今头条!手机测试之-adb
环球时讯:《鹅鸭杀》爆火,一文带你了解如何实现顶流社交游戏
DevOps: 自动与手动部署语义化版本(Semantic Versioning)实操
焦点信息:手上有了这些工具,明天争取6点下班了!
全球焦点!平价神器!新iPad mini 7曝光:处理器/屏幕惊喜
女子买电影票发现仅一个普通座位 其他全是C位 工作人员也无语
每日短讯:他真的很忙!雷军站公司门口给小米员工挨个发红包
最资讯丨打工人热议今天怎么才是周一:专家科普节后综合征
【全球热闻】《无名》折戟春节档:4.9亿票房只排第4、粉黑大战尴尬
springboot整合activiti实现流程审批(支持单体、微服务融合)
环球百事通!FPGA用ROM输出正弦波
深度学习基础课:卷积层的梯度检查
Dockerfile构建镜像
每日信息:SSL 证书基本概念扫盲
【全球速看料】亏电油耗不到5升 长安UNI-V iDD将于3月上市:或15万起售
要闻:《流浪地球2》有多硬核?工业机器人登上大银幕 周边产品也火了 超额数百倍
神操作 外卖小哥为闯红灯S形走位 被罚20元
当前快报:3.3万元!雷神ZERO 2023上架:搭载RTX 4090和i9-13900HX
【当前独家】女子被石头鱼刺伤整条胳膊肿胀 医生提醒:高档海鲜 鳍有剧毒
实时焦点:【算法训练营day31】LeetCode455. 分发饼干 LeetCode376. 摆动序列 LeetCode53. 最大子序和
记录--这样封装列表 hooks,一天可以开发 20 个页面
焦点热门:如何根据网络位计算主机位的数量
光线传媒回应股价暴跌:节前涨过一波 公司主投的《深海》票房不及预期
世界观天下!庆祝中国新年!梅西东家巴黎全队球员身穿中文球衣出战
焦点速读:4人修改游戏源代码 架设私服 2年牟利260余万元