Android表情面板和软键盘切换时跳闪问题的解决方法

  

现在很多应用都会在让用户输入各种文本信息的时候同时多提供一个表情面板,这样就会出现一个问题,即表情面板的跳闪问题要输入文本信息,那固然是需要弹出软键盘,在软键盘显示的情况下,此时如果要切换显示出表情面板,由于表情面板不可能和用户的软键盘高度恰好一样,此外由于控件的上下移位,就会出现表情面板的跳闪现象

  

在点击切换按钮的时候,表情面板会先向上跳,然后再往下移,这样就会带来很差的用户体验,效果如下图所示:

  

 Android表情面板和软键盘切换时跳闪问题的解决方法

  

这里提供一个解决方案,使软键盘和表情面板可以很自然地切换,效果如下图所示:

  

 Android表情面板和软键盘切换时跳闪问题的解决方法

  

解决思路主要是这样:系统在弹出软键盘时,会将内容输入框视图以及其之上的观点都给顶上去,当切换到表情面板时,只有将表情面板的高度保持为和软键盘的高度一致,才能自然地切换。此外,还需要将内容输入框视图以及其之上的视图的位置固定住,这样才不会出现跳闪问题

  

主要的操作逻辑都在EmojiKeyboard类中

     /* *   * chenZY   *时间:2017/8/26十八12   *描述:   */公开课EmojiKeyboard {   私人活动活动;//文本输入框   私人EditText EditText;//表情面板   私人观点emojiPanelView;//内容的观点,即除了表情布局和输入框布局以外的布局//用于固定输入框一行的高度以防止跳闪   私人观点contentView;   私人InputMethodManager InputMethodManager;   私人SharedPreferences SharedPreferences;   私有静态最终字符串EMOJI_KEYBOARD=癊mojiKeyboard”;   私有静态最终字符串KEY_SOFT_KEYBOARD_HEIGHT=癝oftKeyboardHeight”;   私有静态最终int SOFT_KEYBOARD_HEIGHT_DEFAULT=654;   私人处理程序处理程序;   公共EmojiKeyboard(活动活动,EditText EditText emojiPanelView视图,视图emojiPanelSwitchView视图contentView) {   init(活动,editText emojiPanelView、emojiPanelSwitchView contentView);   }   私人空init(活动活动,EditText EditText、视图emojiPanelView emojiPanelSwitchView视图,视图contentView) {   这一点。活动=活动;   这一点。editText editText=;   这一点。emojiPanelView=emojiPanelView;   这一点。contentView=contentView;   this.editText。setOnTouchListener(新View.OnTouchListener () {   @Override   公共布尔ondraw(最终视图v, MotionEvent事件){   如果(event.getAction ()==MotionEvent。ACTION_UP,,EmojiKeyboard.this.emojiPanelView.isShown ()) {   lockContentViewHeight ();   hideEmojiPanel(真正的);   unlockContentViewHeight ();   }   返回错误;   }   });   this.contentView。setOnTouchListener(新View.OnTouchListener () {   @Override   公共布尔ondraw(查看视图,MotionEvent MotionEvent) {   如果(motionEvent.getAction ()==MotionEvent.ACTION_UP) {   如果(EmojiKeyboard.this.emojiPanelView.isShown ()) {   hideEmojiPanel(假);   }else if (isSoftKeyboardShown ()) {   hideSoftKeyboard ();   }   }   返回错误;   }   });//用于弹出表情面板的观点   emojiPanelSwitchView。setOnClickListener(新View.OnClickListener () {   @Override   公共空间onClick(查看v) {   如果(EmojiKeyboard.this.emojiPanelView.isShown ()) {   lockContentViewHeight ();   hideEmojiPanel(真正的);   unlockContentViewHeight ();   其他}{   如果(isSoftKeyboardShown ()) {   lockContentViewHeight ();   showEmojiPanel ();   unlockContentViewHeight ();   其他}{   showEmojiPanel ();   }   }   }   });   这一点。inputMethodManager=(inputMethodManager) this.activity.getSystemService (Context.INPUT_METHOD_SERVICE);   这一点。sharedPreferences=this.activity。getSharedPreferences (EMOJI_KEYBOARD Context.MODE_PRIVATE);   this.activity.getWindow () .setSoftInputMode (WindowManager.LayoutParams。SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);   这一点。处理程序=new处理程序();   init ();   }/* *   *如果之前没有保存过键盘高度值   *则在进入活动时自动打开键盘,并把高度值保存下来   */私人空间init () {   如果(! sharedPreferences.contains (KEY_SOFT_KEYBOARD_HEIGHT)) {   处理程序。postDelayed(新Runnable () {   @Override   公共空间run () {   showSoftKeyboard(真正的);   }   },200);   }   }/* *   *当点击返回键时需要先隐藏表情面板   */公共布尔interceptBackPress () {   如果(emojiPanelView.isShown ()) {   hideEmojiPanel(假);   返回true;   }   返回错误;   }/* *   *锁定内容视图以防止跳闪   */私人空间lockContentViewHeight () {   LinearLayout。LayoutParams LayoutParams=(LinearLayout.LayoutParams) contentView.getLayoutParams ();   layoutParams。身高=contentView.getHeight ();   layoutParams。重量=0;   }/* *   *释放锁定的内容   */私人空间unlockContentViewHeight () {   处理程序。postDelayed(新Runnable () {   @Override   公共空间run () {   ((LinearLayout.LayoutParams) contentView.getLayoutParams ())。重量=1;   }   },200);   }/* *   *获取键盘的高度   */私人int getSoftKeyboardHeight () {   矩形矩形=new矩形();   .getDecorView activity.getWindow () () .getWindowVisibleDisplayFrame(矩形);//屏幕当前可见高度,不包括状态栏   int displayHeight=rect.bottom - rect.top;//屏幕可用高度   int availableHeight=ScreenUtils.getAvailableScreenHeight(活动);//用于计算键盘高度   int softInputHeight=availableHeight - displayHeight ScreenUtils.getStatusBarHeight(活动);   日志。e (“TAG-di displayHeight + " ");   日志。e (“TAG-av availableHeight + " ");   日志。e(“标签”,softInputHeight + " ");   如果(softInputHeight !=0) {//因为考虑到用户可能会主动调整键盘高度,所以只能是每次获取到键盘高度时都将其存储起来   sharedPreferences.edit ()。putInt (KEY_SOFT_KEYBOARD_HEIGHT softInputHeight)苹果();   }   返回softInputHeight;   }/* *   *获取本地存储的键盘高度值或者是返回默认值   */私人int getSoftKeyboardHeightLocalValue () {   sharedPreferences返回。getInt (KEY_SOFT_KEYBOARD_HEIGHT SOFT_KEYBOARD_HEIGHT_DEFAULT);   }/* *   *判断是否显示了键盘   */私人布尔isSoftKeyboardShown () {   返回getSoftKeyboardHeight () !=0;   }/* *   *令编辑框获取焦点并显示键盘   */私人空间showSoftKeyboard(布尔saveSoftKeyboardHeight) {   editText.requestFocus ();   inputMethodManager。editText showSoftInput (0);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Android表情面板和软键盘切换时跳闪问题的解决方法