背景
产品喝大了,说开发一个聊天界面,功能参照微信即可。
这是应了那句话:新人一开口,便知有没有~~真是风趣幽默。
问题分析
其实仔细看微信的聊天面板,功能拆分出来,主要有以下几点:
(1)emoji表情,自定义表情等等。这里可以归类为“表情”tab。
(2)语音交互,音频录制播放压缩。
(3)媒体交互,选择图片,视频,文件等等。
核心就是上面的内容,锦上添花的功能就不再叙述了。
实现效果
开发环境
win10
jdk8+
as2024+
本文内容
本文将会讲解整体的交互实现思路,如键盘交互,删除文本细节等。文末将会有源码地址。
(一)键盘交互
对于键盘交互,其实是一个很核心的问题。设想一下,如果用户在使用输入控件的时候,进行键盘的切换,然后界面突然闪一下,或者说键盘缩一下,又弹出来。这用户体验一下子就很拉跨。所以必须要移除掉“闪一下”“突然弹出来”这种不好的现象。
(1)键盘闪一下,到底是为什么呢?主要的复现场景如下:
(1-1)输入法显示中,控件中点击按钮,接下来底部布局显示,然后键盘隐藏,这个时候,界面就会闪一下,然后键盘消失。
(1-2)输入法隐藏中,空间中点击按钮,接下来布局显示,键盘也显示,这种情况也会闪一下。
为了解决上述的问题,我们有必要先去了解一下安卓键盘的“模式”:
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE 和
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING
resize故名思意,就是重新设置大小用于适配键盘操作。
nothing,就是说不管你布局了,不做适配。
那换一种思路,是不是只在我们需要键盘不优先响应的情况下,先设置对应的“模式”,然后再去处理布局后,及时调整键盘最终的模式,这样就完成了适配工作了。
还要注意。如果监听键盘完全收起?博主这里是直接监听R.id.content的viewTreeObserver实现,当键盘收起的时候,通过该监听,可以监听到键盘是否完全收起。核心代码如下:
//getActivity有可能为空
FrameLayout content = getActivity().findViewById(android.R.id.content);
content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
content.getViewTreeObserver().removeOnGlobalLayoutListener(this);
mVBottomContainer.setVisibility(bottomViewShow ? View.VISIBLE : View.GONE);
}
});
上述代码就是当键盘完全收起的时候,对指定布局进行显隐。
注意点
对于设置键盘模式,经过实测,是有一定的延时才会实现。
源码
源码获取方式,关注回复: 安卓原生聊天面板源码
即可获得: