Android实现表情功能
作者:qq_21467035 发布时间:2023-03-05 06:46:27
本文实例为大家分享了Android实现表情功能的具体代码,供大家参考,具体内容如下
Dialog实现表情评论功能核心问题:
1、如何得到键盘弹起和隐藏状态
2、在于表情和键盘切换时候,防止Dialog抖动
问题1:由于无法获取键盘弹起状态,但是键盘弹起,View尺寸变化,同时被onSizeChanged()调用。
View 源码:
/**
* This is called during layout when the size of this view has changed. If
* you were just added to the view hierarchy, you're called with the old
* values of 0.
*
* @param w Current width of this view.
* @param h Current height of this view.
* @param oldw Old width of this view.
* @param oldh Old height of this view.
*/
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
}
我们可以通过继承View 重写 onSizeChanged方法得到View尺寸变化来判断键盘是否弹起:
int minKeyboardHeight = dm.heightPixels / 4; (屏幕高度1/4)
当 oldh - h > minKeyboardHeight时,键盘弹起
当 h - oldh > minKeyboardHeight时,键盘隐藏
如此即可获取键盘的弹起、隐藏状态 和键盘高度 inputHeight(同时也是表情布局高度) 。
问题2:表情和键盘切换时候,防止Dialog抖动
表情和键盘切换时候,由于DialogViewHeight 高度变化导致的Dialog高度重新计算高度而产生抖动;那么当表情和键盘切换时DialogViewHeight 中间 DialogViewHeight 高度固定不变导致界面抖动。
键盘——>表情:因为当键盘弹起时候,我们已经知道键盘的高度,那么当切换表情时候:(键盘高度==表情高度)
①、 锁高度 DialogViewHeight = CommentView高度 + inputHeight(键盘高度)。锁高重点在于设置 DialogView固定值,同时设置 layoutParams.weight = 0F
②、然后设置表情布局 VISIBLE 和 隐藏键盘
③、释放锁高。释放锁高重点在于设置 DialogViewHeight = LinearLayout.LayoutParams.MATCH_PARENT,同时设置 layoutParams.weight = 1.0F
代码:
//①锁高:
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) CommentView.getLayoutParams();
layoutParams.height = DialogView.getHeight();
layoutParams.weight = 0.0f;
llContentView.setLayoutParams(layoutParams);
//②表情布局显示
EmotionView.setVisibility(View.VISIBLE)
//隐藏键盘
//③释放高度
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) DialogView.getLayoutParams();
layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT;
layoutParams.weight = 1.0f;
llContentView.setLayoutParams(layoutParams);
表情——>键盘:表情切换键盘其实跟键盘切换表情一样,分三步
①、 锁高度:锁高度 DialogViewHeight = CommentView高度 + inputHeight(键盘高度)。锁高重点在于设置 DialogView固定值,同时设置 layoutParams.weight = 0F
②、然后设置表情布局 GONE 和 弹起键盘
③、释放锁高。释放锁高重点在于设置 DialogViewHeight = LinearLayout.LayoutParams.MATCH_PARENT,同时设置 layoutParams.weight = 1.0F
//①锁高:
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) CommentView.getLayoutParams();
layoutParams.height = DialogView.getHeight();
layoutParams.weight = 0.0f;
llContentView.setLayoutParams(layoutParams);
//②表情布局隐藏
EmotionView.setVisibility(View.GONE)
//显示键盘
//③释放高度
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) DialogView.getLayoutParams();
layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT;
layoutParams.weight = 1.0f;
llContentView.setLayoutParams(layoutParams);
总结:
1、onSizeChanged方法,重点在于获取键盘的高度。方便后面表情布局高度设置。
2、表情切换主要在于对布局进行锁高和释放高度,来实现表情、键盘切换时候,Dialog布局高度是没有变化。
来源:https://blog.csdn.net/qq_21467035/article/details/116716341
猜你喜欢
- 在本文中,我们将通过用C#重构一个非常简单的代码示例来解释依赖注入和IoC容器。 简介:依赖注入和IoC乍一看可能相当复杂,但它们
- 详解java中接口与抽象类的区别1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是
- 本文实例讲述了C#关闭指定名字进程的方法。分享给大家供大家参考。具体实现方法如下:public static void stopNamedP
- 本文实例为大家分享了C#实现多个计时器记录不同定时时间的具体代码,供大家参考,具体内容如下1.定义Timer类、定义委托//定义Timer类
- EventBus 可以很方便地进行各组件间的通信,解耦性更强,比广播更好用。EventBus 3 简介EventBus是一种为了优化Andr
- 前面一篇文章实现了使用ViewPager实现 * launcher拖动效果 ,后来很多朋友问能不能实现左右循环滑动效果和引导页面。今天实现了左
- 本文要解决在侧滑菜单右边加个文本框,并能实现文本的上下滑动和菜单的左右滚动。这里推荐可以好好看看android的触摸事件的分发机制,这里我就
- 一、来源项目中遇到混合动画的情况,每次实现都需要生命一堆属性,让代码变得杂乱,难以维护。参考 iOS 组动画 CAAimationGroup
- android开发中有时候碰到切换语言的需求,这时候需要通过代码动态改变当前运行语言。package com.example.android
- 引看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈
- mysql默认的隔离级别是repeatable_read根据spring文档,数据库一共有4个隔离级别read_uncommitread_c
- 经过测试 将resultMap="java.lang.Integer"改成resultType="java.l
- 先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE
- Android指定SnackBar在屏幕的位置Snackbar 常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方,并且是在屏幕所有
- 前言真的一秒就可以实现么?是的,因为我们直接复制粘贴工具类拿来用就可以。 工具类 WaterMarkUtil.java&
- 一个简单的网格布局activity_main.xml<?xml version="1.0" encoding=&q
- mybatis-plus 新增/修改 自动填充指定字段1.需要修改的字段在模型类上添加@TableField(fill = FieldFil
- 一、前言今天我们来说一说 Spring Bean 的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象。因为 Spring Bean 的生
- LZ77压缩算法原理的理解数据压缩是一个减小数据存储空间的过程,目前被应用在软件工程的各个地方,了解其一些原理,方便我们更好的甄选压缩方案。
- 一、为何要使用netty开发由于之前已经用Java中的socket写过一版简单的聊天室,这里就不再对聊天室的具体架构进行细致的介绍了,主要关