Android 軟鍵盤和emoji表情切換方案褐耳,和微信幾乎一樣的體驗(yàn)

demo.gif

注意:本項(xiàng)目還有一個(gè)小坑诈闺。第一次進(jìn)去的時(shí)候有時(shí)候輸入框沒有得到焦點(diǎn),沒有彈出軟鍵盤铃芦,所以不能更好的量取軟鍵盤高度雅镊,給了一個(gè)默認(rèn)值787 軟鍵盤默認(rèn)高度。所以可以忽略不計(jì)刃滓,一旦彈出了軟鍵盤仁烹,這個(gè)高度就被記錄下來了,存在本地咧虎,以便下一次用卓缰。
這幾天沒事,想到之前做im聊天的時(shí)候砰诵,表情輸入和鍵盤之間的切換體驗(yàn)有些問題征唬,看了微信的,覺得真好茁彭,就有了想描摹一下的心思总寒,所有有了這個(gè)demo。站在巨人的肩膀上理肺,我們才能走得更遠(yuǎn)摄闸。
一些配置,導(dǎo)入相關(guān)的庫:

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表情輸入,其實(shí)很簡單哲嘲。

調(diào)用兩個(gè)接口
EmojiconGridFragment.OnEmojiconClickedListener//點(diǎn)擊表情接口
EmojiconsFragment.OnEmojiconBackspaceClickedListener//刪除表情接口

然后實(shí)現(xiàn)一下方法贪薪,emoji就好了
@Override 
 public void onEmojiconBackspaceClicked(View v) {
 EmojiconsFragment.backspace(emojiEditTextView);
 } 
 
 
 @Override 
 public void onEmojiconClicked(Emojicon emojicon) {
 EmojiconsFragment.input(emojiEditTextView, emojicon);
 } 

在運(yùn)用前,要知道這個(gè)公式:
KeyBoard_H = Screen_H - StatusBar_H - AppRect_H
軟鍵盤高度 = 分辨率高 - 狀態(tài)欄高 - 應(yīng)用可視高
于是有了這個(gè)方法

 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為默認(rèn)軟鍵盤高度 基本差不離
        }else{
            SharedPreferencesUtils.putIntShareData("KeyboardHeight", height);
        }
        return height;
    }

主頁布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    <LinearLayout
        android:id="@+id/emojicons_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <com.rockerhieu.emojicon.EmojiconEditText
            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" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="?attr/colorPrimary"
            android:gravity="center">

            <ImageView
                android:id="@+id/emojicons_icon"
                android:layout_width="40dip"
                android:layout_height="40dip"
                android:padding="8dip"
                android:src="@mipmap/ic_emoticon" />
        </LinearLayout>
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/emojicons_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"></RelativeLayout>
</LinearLayout>

剩下略提一下軟鍵盤和輸入框的切換

 @OnClick({R.id.emojicons_icon, R.id.emojicons_edit})
    void onClick(View view) {
        switch (view.getId()){
            case R.id.emojicons_icon://點(diǎn)擊表情圖標(biāo),如果表情顯示眠副,隱藏表情画切,打開軟鍵盤。反之囱怕,顯示表情霍弹,隱藏鍵盤
                if (emojiconsLayout.isShown()) {
                    hideEmotionView(true);
                } else {
                    showEmotionView(SystemUtils.isKeyBoardShow(this));
                }
                break;
            case R.id.emojicons_edit://點(diǎn)擊輸入框毫别,打開軟鍵盤,隱藏表情
                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的手機(jī)典格,高度高了一個(gè)statusBar
        int lockHeight = SystemUtils.getAppContentHeight(this);
        lockContainerHeight(lockHeight);
    }

然后demo里面用到了開源emoji項(xiàng)目岛宦,貼上開源地址,表示感謝
emoji表情開源:https://github.com/rockerhieu/emojicon
本demo開源地址 :https://github.com/a12a15a05/KeyBoardDemo

有bug或問題耍缴,歡迎探討砾肺,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市防嗡,隨后出現(xiàn)的幾起案子变汪,更是在濱河造成了極大的恐慌,老刑警劉巖蚁趁,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裙盾,死亡現(xiàn)場離奇詭異,居然都是意外死亡他嫡,警方通過查閱死者的電腦和手機(jī)番官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钢属,“玉大人徘熔,你說我怎么就攤上這事∠常” “怎么了近顷?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宁否。 經(jīng)常有香客問我,道長缀遍,這世上最難降的妖魔是什么慕匠? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮域醇,結(jié)果婚禮上台谊,老公的妹妹穿的比我還像新娘。我一直安慰自己譬挚,他們只是感情好锅铅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著减宣,像睡著了一般盐须。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漆腌,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天贼邓,我揣著相機(jī)與錄音阶冈,去河邊找鬼。 笑死塑径,一個(gè)胖子當(dāng)著我的面吹牛女坑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统舀,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼匆骗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誉简?” 一聲冷哼從身側(cè)響起碉就,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎描融,沒想到半個(gè)月后铝噩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窿克,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年骏庸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片年叮。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡具被,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出只损,到底是詐尸還是另有隱情一姿,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布跃惫,位于F島的核電站叮叹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爆存。R本人自食惡果不足惜蛉顽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望先较。 院中可真熱鬧携冤,春花似錦、人聲如沸闲勺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菜循。三九已至翘地,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背子眶。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工瀑凝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臭杰。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓粤咪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渴杆。 傳聞我的和親對象是個(gè)殘疾皇子寥枝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本文轉(zhuǎn)載自wuwhs的segmentfault專欄 最近一段時(shí)間在做 H5 聊天項(xiàng)目,踩過其中一大坑:輸入框獲取焦...
    兔子不打地鼠打代碼閱讀 10,010評論 1 12
  • 最近做了一個(gè)Android UI相關(guān)開源項(xiàng)目庫匯總磁奖,里面集合了OpenDigg 上的優(yōu)質(zhì)的Android開源項(xiàng)目庫...
    OpenDigg閱讀 17,176評論 6 223
  • 先上個(gè)圖: 首先先科普一下囊拜,目前軟鍵盤設(shè)置大概有那么幾種狀態(tài):1.軟鍵盤彈出時(shí),獲取焦點(diǎn)的輸入框會被頂起比搭,整個(gè)界面...
    廣州蕭敬騰閱讀 14,689評論 3 12
  • 可能這些是你想要的H5軟鍵盤兼容方案 前言 輸入框獲取焦點(diǎn)冠跷,軟鍵盤彈起,要求輸入框吸附(或頂)在輸入法框上身诺。需求很...
    記住了_葉閱讀 779評論 0 2
  • 之前在做H5 項(xiàng)目蜜托,踩過其中一大坑:輸入框獲取焦點(diǎn),軟鍵盤彈起霉赡,要求輸入框吸附(或頂)在輸入法框上橄务。需求很明確,看...
    超級無敵可愛的閱讀 2,255評論 0 3