注意:本项目还有一个小坑。第一次进去的时候有时候输入框没有得到焦点,没有弹出软键盘,所以不能更好的量取软键盘高度,给了一个默认值787 软键盘默认高度。所以可以忽略不计,一旦弹出了软键盘,这个高度就被记录下来了,存在本地,以便下一次用。

这几天没事,想到之前做im聊天的时候,表情输入和键盘之间的切换体验有些问题,看了微信的,觉得真好,就有了想描摹一下的心思,所有有了这个demo。站在巨人的肩膀上,我们才能走得更远。

一些配置,导入相关的库:

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

testCompile 'junit:junit:4.12'

compile project(':library')

compile 'com.android.support:appcompat-v7:23.1.1'

compile 'com.android.support:design:23.1.1'

compile 'com.jakewharton:butterknife:7.0.1'//butterknife注解框架

compile 'com.android.support:support-v4:23.1.1'

}

键盘弹出方案

android:windowSoftInputMode="stateVisible|adjustResize"

提一下emoji表情输入,其实很简单。

调用两个接口

EmojiconGridFragment.OnEmojiconClickedListener//点击表情接口

EmojiconsFragment.OnEmojiconBackspaceClickedListener//删除表情接口

然后实现一下方法,emoji就好了

@Override

public void onEmojiconBackspaceClicked(View v) {

EmojiconsFragment.backspace(emojiEditTextView);

}

@Override

public void onEmojiconClicked(Emojicon emojicon) {

EmojiconsFragment.input(emojiEditTextView, emojicon);

}

在运用前,要知道这个公式:

KeyBoard_H = Screen_H - StatusBar_H - AppRect_H

软键盘高度 = 分辨率高 - 状态栏高 - 应用可视高

于是有了这个方法

public static int getKeyboardHeight(Activity paramActivity) {

int height = SystemUtils.getScreenHeight(paramActivity) - SystemUtils.getStatusBarHeight(paramActivity)

- SystemUtils.getAppHeight(paramActivity);

if (height == 0) {

height = SharedPreferencesUtils.getIntShareData("KeyboardHeight", 787);//787为默认软键盘高度 基本差不离

}else{

SharedPreferencesUtils.putIntShareData("KeyboardHeight", height);

}

return height;

}

主页布局文件

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:emojicon="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

app:layout_behavior="@string/appbar_scrolling_view_behavior"

tools:context="com.wobiancao.keyboarddemo.MainActivity"

tools:showIn="@layout/activity_main">

android:id="@+id/emojicons_container"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:orientation="vertical">

android:id="@+id/emojicons_edit"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:gravity="left|top"

android:padding="8dp"

android:textSize="18sp"

emojicon:emojiconSize="18sp" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:background="?attr/colorPrimary"

android:gravity="center">

android:id="@+id/emojicons_icon"

android:layout_width="40dip"

android:layout_height="40dip"

android:padding="8dip"

android:src="@mipmap/ic_emoticon" />

android:id="@+id/emojicons_layout"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:visibility="gone">

剩下略提一下软键盘和输入框的切换

@OnClick({R.id.emojicons_icon, R.id.emojicons_edit})

void onClick(View view) {

switch (view.getId()){

case R.id.emojicons_icon://点击表情图标,如果表情显示,隐藏表情,打开软键盘。反之,显示表情,隐藏键盘

if (emojiconsLayout.isShown()) {

hideEmotionView(true);

} else {

showEmotionView(SystemUtils.isKeyBoardShow(this));

}

break;

case R.id.emojicons_edit://点击输入框,打开软键盘,隐藏表情

hideEmotionView(true);

break;

default:

break;

}

}

/**

* 隐藏emoji

**/

private void hideEmotionView(boolean showKeyBoard) {

if (emojiconsLayout.isShown()) {

if (showKeyBoard) {

LinearLayout.LayoutParams localLayoutParams = (LinearLayout.LayoutParams) emojiconsContainer.getLayoutParams();

localLayoutParams.height = emojiconsLayout.getTop();

localLayoutParams.weight = 0.0F;

emojiconsLayout.setVisibility(View.GONE);

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

SystemUtils.showKeyBoard(editEmojicon);

editEmojicon.postDelayed(new Runnable() {

@Override

public void run() {

unlockContainerHeightDelayed();

}

}, 200L);

} else {

emojiconsLayout.setVisibility(View.GONE);

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

unlockContainerHeightDelayed();

}

}

}

private void showEmotionView(boolean showAnimation) {

if (showAnimation) {

transitioner.setDuration(200);

} else {

transitioner.setDuration(0);

}

emotionHeight = SystemUtils.getKeyboardHeight(this);

SystemUtils.hideSoftInput(editEmojicon);

emojiconsLayout.getLayoutParams().height = emotionHeight;

emojiconsLayout.setVisibility(View.VISIBLE);

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

//在5.0有navigationbar的手机,高度高了一个statusBar

int lockHeight = SystemUtils.getAppContentHeight(this);

lockContainerHeight(lockHeight);

}

demo apk地址:

有bug或问题,欢迎探讨,谢谢

转载注明来源即可

android 调出键盘表情_Android 软键盘和emoji表情切换方案,和微信几乎一样的体验...相关推荐

  1. edittext 软键盘上方_Android 软键盘的全面解析,让你不再怕控件被遮盖

    原标题:Android 软键盘的全面解析,让你不再怕控件被遮盖 作者 | Vander丶 编辑 | 苏宓 微信公众号 | mobilehub 背景 Android软键盘这块从我入职到现在,是一个一直纠 ...

  2. android 页面默认不弹软键盘_Android 软键盘的全面解析,让你不再怕控件被遮盖!...

    作者 | Vander丶 编辑 | 苏宓 微信公众号 | mobilehub 背景 Android软键盘这块从我入职到现在,是一个一直纠缠我的问题. 从布局挤压,到EditText显示不全,在到弹出时 ...

  3. 转载 仿微信表情与软键盘冲突

    android高仿微信表情输入与键盘输入(详细实现分析) 本文是我在做仿微信IM时,解决表情栏与软键盘冲突时参考的文章,很有价值,故在此将之转载,以便后期学习. 目录(?)[+] 解决表情与键盘切换跳 ...

  4. android开发隐藏软键盘,Android开发之完全隐藏软键盘的方法

    隐藏软键盘一直是我头痛的事情,没有找到一种真正能隐藏的方法.点击EditText的时候总是弹出软键盘.-----杯具 杯具(一): InputMethodManager im =(InputMetho ...

  5. android 软键盘工具类,Android开发之弹出软键盘工具类简单示例

    本文实例讲述了Android开发之弹出软键盘工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.content.Co ...

  6. android 软键盘遮挡登陆按钮的问题,Android优雅的方式解决软键盘遮挡按钮问题

    前言 比如在进行登录的操作中,用户输入完密码之后,肯定是想直接点击登录按钮的.返回键隐藏软键盘这样的体验肯定很糟糕,程序员,遇到问题解决问题. 实现1 xml android:id="@+i ...

  7. android点击键盘外关闭软键盘

    安卓功能记录之点击键盘外关闭软键盘,用于日常记录 //关闭软键盘@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.g ...

  8. html软键盘挤压布局,软键盘挤压布局问题

    软键盘挤压导致软键盘上面有块小的布局 如上图,我这里用的是mui-scroll-wrapper区域滚动,占了布局的90%,其余10%就是底部布局 我这里监听了textarea的focus事件,当点击输 ...

  9. Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法 计算软键盘上下

    Atitit 算法之道 attilax著 1. 编码算法 3 1.1. Base64 htmlencode  urlencode 3 2. Ui方面的算法 3 2.1. 软键盘算法  计算软键盘上下左 ...

最新文章

  1. JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)...
  2. 如何解决Connect超时导致的阻塞问题
  3. Android init.rc执行顺序
  4. 语句作用_3分钟短文:Laravel模型作用域,为你“节省”更多代码
  5. 【链接转载保存】Collections.singletonList方法的使用
  6. (5)vue.js 基础语法—el选项
  7. 深入浅出ClassLoader(译)
  8. hls和modelsim进行联合仿真
  9. 支付宝玉伯:我心目中的优秀API
  10. swift 高级进阶1:类与结构体(上)
  11. 亲测VS2010纯静态编译QT4.8.2,实现VS2010编译调试Qt程序
  12. python pip 删除所有包
  13. python编写一个产品管理系统
  14. OSChina 周四乱弹 —— 你从小继承了程序员基因
  15. 什么是CGCS2000坐标系
  16. vscode 是干什么用的_vscode里的launch.json是干什么用的
  17. 第二章 软件项目确立
  18. 如何在linux系统中打开巨型帧
  19. tpl文件如何导入ps?tpl文件笔刷怎么安装?
  20. 计算机内区位码默认是几进制,汉字的区位码怎么转换成十六进制?

热门文章

  1. matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释
  2. python有几个系列_python系列1-就业篇
  3. python enumerate用法总结_python enumerate用法总结
  4. 【蜕变之路】第29天 CAST和CONVERT的区别(2019年3月19日)
  5. 视不可当:信息图与可视化传播
  6. 《SAP HANA平台应用开发》—第2章2.3节熟悉SAP HANA工作台
  7. 我的Android进阶之旅------gt;解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug...
  8. java删除文件夹的所有文件
  9. Xampp里Mysql服务启动不起来,错误1067
  10. 漫谈数据仓库之维度建模