国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 表情面板和軟鍵盤切換時跳閃問題的解決方法

2019-10-22 18:29:14
字體:
來源:轉載
供稿:網友

現在很多應用都會在讓用戶輸入各種文本信息的時候同時多提供一個表情面板,這樣就會出現一個問題,即表情面板的跳閃問題要輸入文本信息,那固然是需要彈出軟鍵盤,在軟鍵盤顯示的情況下,此時如果要切換顯示出表情面板,由于表情面板不可能和用戶的軟鍵盤高度恰好一樣,此外由于控件的上下移位,就會出現表情面板的跳閃現象

在點擊切換按鈕的時候,表情面板會先向上跳,然后再往下移,這樣就會帶來很差的用戶體驗,效果如下圖所示:

android,面板,android軟鍵盤切換

這里提供一個解決方案,使軟鍵盤和表情面板可以很自然地切換,效果如下圖所示:

android,面板,android軟鍵盤切換

解決思路主要是這樣:系統在彈出軟鍵盤時,會將內容輸入框View以及其之上的View都給頂上去,當切換到表情面板時,只有將表情面板的高度保持為和軟鍵盤的高度一致,才能自然地切換。此外,還需要將內容輸入框View以及其之上的View的位置固定住,這樣才不會出現跳閃問題

主要的操作邏輯都在 EmojiKeyboard 類中

/** * 作者: chenZY * 時間: 2017/8/26 18:12 * 描述: */public class EmojiKeyboard { private Activity activity; //文本輸入框 private EditText editText; //表情面板 private View emojiPanelView; //內容View,即除了表情布局和輸入框布局以外的布局 //用于固定輸入框一行的高度以防止跳閃 private View contentView; private InputMethodManager inputMethodManager; private SharedPreferences sharedPreferences; private static final String EMOJI_KEYBOARD = "EmojiKeyboard"; private static final String KEY_SOFT_KEYBOARD_HEIGHT = "SoftKeyboardHeight"; private static final int SOFT_KEYBOARD_HEIGHT_DEFAULT = 654; private Handler handler; public EmojiKeyboard(Activity activity, EditText editText, View emojiPanelView, View emojiPanelSwitchView, View contentView) {  init(activity, editText, emojiPanelView, emojiPanelSwitchView, contentView); } private void init(Activity activity, EditText editText, View emojiPanelView, View emojiPanelSwitchView, View contentView) {  this.activity = activity;  this.editText = editText;  this.emojiPanelView = emojiPanelView;  this.contentView = contentView;  this.editText.setOnTouchListener(new View.OnTouchListener() {   @Override   public boolean onTouch(final View v, MotionEvent event) {    if (event.getAction() == MotionEvent.ACTION_UP && EmojiKeyboard.this.emojiPanelView.isShown()) {     lockContentViewHeight();     hideEmojiPanel(true);     unlockContentViewHeight();    }    return false;   }  });  this.contentView.setOnTouchListener(new View.OnTouchListener() {   @Override   public boolean onTouch(View view, MotionEvent motionEvent) {    if (motionEvent.getAction() == MotionEvent.ACTION_UP) {     if (EmojiKeyboard.this.emojiPanelView.isShown()) {      hideEmojiPanel(false);     } else if (isSoftKeyboardShown()) {      hideSoftKeyboard();     }    }    return false;   }  });  //用于彈出表情面板的View  emojiPanelSwitchView.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View v) {    if (EmojiKeyboard.this.emojiPanelView.isShown()) {     lockContentViewHeight();     hideEmojiPanel(true);     unlockContentViewHeight();    } else {     if (isSoftKeyboardShown()) {      lockContentViewHeight();      showEmojiPanel();      unlockContentViewHeight();     } else {      showEmojiPanel();     }    }   }  });  this.inputMethodManager = (InputMethodManager) this.activity.getSystemService(Context.INPUT_METHOD_SERVICE);  this.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);  this.handler = new Handler();  init(); } /**  * 如果之前沒有保存過鍵盤高度值  * 則在進入Activity時自動打開鍵盤,并把高度值保存下來  */ private void init() {  if (!sharedPreferences.contains(KEY_SOFT_KEYBOARD_HEIGHT)) {   handler.postDelayed(new Runnable() {    @Override    public void run() {     showSoftKeyboard(true);    }   }, 200);  } } /**  * 當點擊返回鍵時需要先隱藏表情面板  */ public boolean interceptBackPress() {  if (emojiPanelView.isShown()) {   hideEmojiPanel(false);   return true;  }  return false; } /**  * 鎖定內容View以防止跳閃  */ private void lockContentViewHeight() {  LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) contentView.getLayoutParams();  layoutParams.height = contentView.getHeight();  layoutParams.weight = 0; } /**  * 釋放鎖定的內容View  */ private void unlockContentViewHeight() {  handler.postDelayed(new Runnable() {   @Override   public void run() {    ((LinearLayout.LayoutParams) contentView.getLayoutParams()).weight = 1;   }  }, 200); } /**  * 獲取鍵盤的高度  */ private int getSoftKeyboardHeight() {  Rect rect = new Rect();  activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  //屏幕當前可見高度,不包括狀態欄  int displayHeight = rect.bottom - rect.top;  //屏幕可用高度  int availableHeight = ScreenUtils.getAvailableScreenHeight(activity);  //用于計算鍵盤高度  int softInputHeight = availableHeight - displayHeight - ScreenUtils.getStatusBarHeight(activity);  Log.e("TAG-di", displayHeight + "");  Log.e("TAG-av", availableHeight + "");  Log.e("TAG-so", softInputHeight + "");  if (softInputHeight != 0) {   // 因為考慮到用戶可能會主動調整鍵盤高度,所以只能是每次獲取到鍵盤高度時都將其存儲起來   sharedPreferences.edit().putInt(KEY_SOFT_KEYBOARD_HEIGHT, softInputHeight).apply();  }  return softInputHeight; } /**  * 獲取本地存儲的鍵盤高度值或者是返回默認值  */ private int getSoftKeyboardHeightLocalValue() {  return sharedPreferences.getInt(KEY_SOFT_KEYBOARD_HEIGHT, SOFT_KEYBOARD_HEIGHT_DEFAULT); } /**  * 判斷是否顯示了鍵盤  */ private boolean isSoftKeyboardShown() {  return getSoftKeyboardHeight() != 0; } /**  * 令編輯框獲取焦點并顯示鍵盤  */ private void showSoftKeyboard(boolean saveSoftKeyboardHeight) {  editText.requestFocus();  inputMethodManager.showSoftInput(editText, 0);  if (saveSoftKeyboardHeight) {   handler.postDelayed(new Runnable() {    @Override    public void run() {     getSoftKeyboardHeight();    }   }, 200);  } } /**  * 隱藏鍵盤  */ private void hideSoftKeyboard() {  inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0); } /**  * 顯示表情面板  */ private void showEmojiPanel() {  int softKeyboardHeight = getSoftKeyboardHeight();  if (softKeyboardHeight == 0) {   softKeyboardHeight = getSoftKeyboardHeightLocalValue();  } else {   hideSoftKeyboard();  }  emojiPanelView.getLayoutParams().height = softKeyboardHeight;  emojiPanelView.setVisibility(View.VISIBLE);  if (emojiPanelVisibilityChangeListener != null) {   emojiPanelVisibilityChangeListener.onShowEmojiPanel();  } } /**  * 隱藏表情面板,同時指定是否隨后開啟鍵盤  */ private void hideEmojiPanel(boolean showSoftKeyboard) {  if (emojiPanelView.isShown()) {   emojiPanelView.setVisibility(View.GONE);   if (showSoftKeyboard) {    showSoftKeyboard(false);   }   if (emojiPanelVisibilityChangeListener != null) {    emojiPanelVisibilityChangeListener.onHideEmojiPanel();   }  } } public interface OnEmojiPanelVisibilityChangeListener {  void onShowEmojiPanel();  void onHideEmojiPanel(); } private OnEmojiPanelVisibilityChangeListener emojiPanelVisibilityChangeListener; public void setEmoticonPanelVisibilityChangeListener(OnEmojiPanelVisibilityChangeListener emojiPanelVisibilityChangeListener) {  this.emojiPanelVisibilityChangeListener = emojiPanelVisibilityChangeListener; }}

這里也提供代碼下載:Android 解決表情面板和軟鍵盤切換時跳閃的問題

總結

以上所述是小編給大家介紹的Android 表情面板和軟鍵盤切換時跳閃問題的解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永州市| 岱山县| 宣武区| 通许县| 栖霞市| 通州市| 常熟市| 塔河县| 句容市| 宁海县| 库车县| 响水县| 固镇县| 区。| 岚皋县| 屯留县| 科技| 阿坝县| 常宁市| 桐庐县| 洪江市| 改则县| 盱眙县| 建德市| 旬阳县| 新和县| 澄江县| 甘肃省| 石柱| 集贤县| 长春市| 突泉县| 霍州市| 蒙城县| 彭州市| 包头市| 克什克腾旗| 那坡县| 阜平县| 北宁市| 永登县|