Пользовательская клавиатура Emoji в Android с изображениями

Я хочу создать свою собственную клавиатуру эмодзи в Android. Пользователь должен иметь возможность выбрать эту клавиатуру в качестве метода ввода для своего телефона Android.

Я попытался создать ее и могу использовать ее в своем приложении, но я понятия не имею, как сделать это как метод ввода, чтобы эта клавиатура была доступна для всех других приложений в моем телефоне. Я где-то читал, что мне нужно создать для этого службу, чтобы она связалась со службой ввода. Кроме того, я не могу понять остальную вещь .

Вот что я сделал. Хотя это отличается от того, что я хочу сделать, но это начало, и я не знаю, как действовать дальше.

  открытый класс MainActivity расширяет FragmentActivity реализует EmoticonsGridAdapter.KeyClickListener {частный статический финал  int NO_OF_EMOTICONS = 100; частный ListView chatList; частный вид popUpView; частный ArrayList  чаты; частный ChatListAdapter mAdapter; частные смайлы LinearLayoutCover; частный PopupWindow popupWindow; частный int keyboardHeight;  частное содержимое EditText; частный LinearLayout parentLayout; частное логическое isKeyBoardVisible; частные смайлы Bitmap []; @Overrideprotected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState);  setContentView (R.layout.activity_main);  chatList = (ListView) findViewById (R.id.chat_list);  parentLayout = (LinearLayout) findViewById (R.id.list_parent);  emoticonsCover = (LinearLayout) findViewById (R.id.footer_for_emoticons);  popUpView = getLayoutInflater (). inflate (R.layout.emoticons_popup, ноль); //Настройка адаптера для списка чатов chats = new ArrayList  ();  mAdapter = новый ChatListAdapter (getApplicationContext (), чаты);  chatList.setAdapter (mAdapter);  chatList.setOnTouchListener (новый OnTouchListener () {@Override публичное логическое значение onTouch (просмотр v, событие MotionEvent) {if (popupWindow.isShowing ()) popupWindow.dismiss (); return false;}}); //Определение высоты клавиатуры по умолчанию, равной 230 dip final float popUpheight = getResources (). GetDimension (R.dimen.keyboard_height);  changeKeyboardHeight ((int) popUpheight); //Отображение и закрытие всплывающих окон при нажатии кнопки смайлов ImageView emoticonsButton = (ImageView) findViewById (R.id.emoticons_button);  emoticonsButton.setOnClickListener (new OnClickListener () {@Override public void onClick (View v) {if (! popupWindow.isShowing ()) {popupWindow.setHeight ((int) (keyboardHeight)); if (isKeyBoardVisible) {emoticonsCover  LinearLayout.GONE);} else {emoticonsCover.setVisibility (LinearLayout.VISIBLE);} popupWindow.showAtLocation (parentLayout, Gravity.BOTTOM, 0, 0);} else {popupWindow.dismiss ();}}});  readEmoticons ();  enablePopUpView ();  checkKeyboardHeight (parentLayout);  enableFooterView ();}/** * Чтение всех смайлов в локальном кеше */private void readEmoticons () {emoticons = new Bitmap [NO_OF_EMOTICONS];  for (short i = 0; i  0) {Spanned sp = content.getText (); chats.add  (sp); content.setText (""); mAdapter.notifyDataSetChanged ();}}});}/** * Переопределение onKeyDown для отключения клавиатуры при нажатии клавиши */@ Overridepublic логическое значение onKeyDown (int keyCode, событие KeyEvent) {  если (popupWindow.isShowing ()) {popupWindow.dismiss ();  вернуть ложь;  } else {return super.onKeyDown (keyCode, событие);  }}/** * Проверка высоты и видимости клавиатуры */int previousHeightDiffrence = 0; private void checkKeyboardHeight (окончательный вид parentLayout) {parentLayout.getViewTreeObserver (). AddOnGlobalLayoutListener (новый ViewTreeObserver.OnGlobalLayoutListener () {void} onGlobalLayoutListener () {public  {Rect r = new Rect (); parentLayout.getWindowVisibleDisplayFrame (r); int screenHeight = parentLayout.getRootView () .getHeight (); int heightDifference = screenHeight - (r.bottom); if (previousHeightDiffrence - heightDifference> 50) {popupupWindow  .dismiss ();} previousHeightDiffrence = heightDifference; if (heightDifference> 100) {isKeyBoardVisible = true; changeKeyboardHeight (heightDifference);} else {isKeyBoardVisible = false;}}});}/** * изменить высоту клавиатуры смайлов в соответствии с  высота фактической * клавиатуры * * @param height * минимальная высота, по которой мы можем убедиться, что фактическая клавиатура * открыта или нет */private void changeKeyboardHeight (int height) {if (height> 100) {keyboardHe  ight = высота;  LinearLayout.LayoutParams params = новый LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, keyboardHeight);  emoticonsCover.setLayoutParams (параметры);  }}/** * Определение всех компонентов клавиатуры смайлов */private void enablePopUpView () {ViewPager pager = (ViewPager) popUpView.findViewById (R.id.emoticons_pager);  pager.setOffscreenPageLimit (3);  pager.setBackgroundColor (Color.WHITE);  ArrayList  paths = новый список ArrayList  ();  for (короткий я = 1; я ", imageGetter, null);  int cursorPosition = content.getSelectionStart ();  content.getText (). insert (cursorPosition, cs);}  

}

EDIT: Это код для настраиваемой клавиатуры, который я реализовал, но я не могу найти, как добавить смайлики на эту клавиатуру.

  открытый класс SimpleIME расширяет InputMethodService реализует KeyboardView.OnKeyboardActionListener {private KeyboardView kv  ;  личная клавиатура клавиатура;  частный просмотр popUpView;  частные логические caps = false;  @Override public View onCreateInputView () {kv = (KeyboardView) getLayoutInflater (). Inflate (R.layout.keyboard, null);  keyboard = новая клавиатура (это, R.xml.qwerty);  kv.setKeyboard (клавиатура);  kv.setOnKeyboardActionListener (это);  kv.invalidateAllKeys ();  popUpView = getLayoutInflater (). inflate (R.layout.emoticons_popup, ноль);  возврат кв;  } @Override public void onKey (int primaryCode, int [] keyCodes) {InputConnection ic = getCurrentInputConnection ();  playClick (primaryCode);  переключатель (primaryCode) {case Keyboard.KEYCODE_DELETE: ic.deleteSurroundingText (1, 0);  сломать;  case Keyboard.KEYCODE_SHIFT: caps =! caps;  keyboard.setShifted (заглавные буквы);  kv.invalidateAllKeys ();  сломать;  case Keyboard.KEYCODE_DONE: ic.sendKeyEvent (новый KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));  сломать;  case -80: Log.d («смайлик», «смайлик нажат»);  сломать;  по умолчанию: char code = (char) primaryCode;  if (Character.isLetter (код) && заглавные буквы) {code = Character.toUpperCase (код);  } ic.commitText (String.valueOf (код), 1);  }} закрытый void playClick (int keyCode) {AudioManager am = (AudioManager) getSystemService (AUDIO_SERVICE);  переключатель (keyCode) {case 32: am.playSoundEffect (AudioManager.FX_KEYPRESS_SPACEBAR);  сломать;  case Keyboard.KEYCODE_DONE: case 10: am.playSoundEffect (AudioManager.FX_KEYPRESS_RETURN);  сломать;  case Keyboard.KEYCODE_DELETE: am.playSoundEffect (AudioManager.FX_KEYPRESS_DELETE);  сломать;  по умолчанию: am.playSoundEffect (AudioManager. FX_KEYPRESS_STANDARD);  }} @Override public void onPress (int primaryCode) {} @Override public void onRelease (int primaryCode) {} @Override public void onText (CharSequence text) {} @Override public void swipeDown () {} @Override public void swipeLeft (  ) {} @Override public void swipeRight () {} @Override public void swipeUp () {}}  

EDIT: Можем ли мы скопировать изображение из списка изображений и вставьте его туда, где открыта клавиатура ??


3

Лучшей реализацией для клавиатуры со смайликами, которую я обнаружил, была выдвижная клавиатура с смайликами. Это действительно хорошая реализация, возможно, с некоторым избыточным кодом, но все же очень хорошая для понимания того, как реализовать клавиатуру, не подходящую для обычного » «кнопки в текст».

ОБНОВЛЕНИЕ

Хорошо, теперь я смог успешно интегрировать сдвигая клавиатуру эмодзи в мою собственный проект 8Vim после значительного перефакторинга обоих проектов.

По сути, все, что вы делаете для клавиатуры эмодзи, — это создаете представление размера клавиатуры, а затем заполняете это представление файлами PNG, соответствующими эмодзи. каждое изображение действует как кнопка и доставляет соответствующие эмодзи в inputConnection.

ОБНОВЛЕНИЕ 2

Я расширил скользящие эмодзи -keyboard и создал более понятную версию, которая должна быть проще для понимания. Взгляните на мою клавиатуру эмодзи

Улучшите этот ответ
отредактировано 25 января ’17 в 17:13
ответил 30 ноября ’16 в 06:54
  • Я хотел попробовать 8vim, но он вылетает при запуске. Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод java.lang.String android.content.Context.getString (int) ‘для ссылки на нулевой объект в inc.flide.eightvim.Setting. (Setting.java:11), как вы реализовали смайлы? с всплывающим окном? — yanivtwin 29 дек. ’16 в 9:52
  • @yanivtwin: я исправил проблему, когда открытие настроек приводило к сбою, если сначала не была открыта клавиатура. Вы можете попробовать это сейчас. — flide 31 дек. ’16 в 9:43
  • спасибо, я попробую еще раз, вы используете всплывающее окно для реализации? или клавиатура xml? — yanivtwin 31 дек. ’16 в 19:37
  • Я новичок в android и вообще не понимаю термин «всплывающее окно», но насколько я понимаю, это не всплывающее окно и не xml клавиатуры. Это просто еще один вид с высотой клавиатуры. — flide 01 янв. ’17 в 7:04
добавить комментарий |

Лучшая реализация для клавиатуры смайликов, которую я обнаружил, — это скользящая клавиатура с эмодзи. Это действительно хорошая реализация, возможно, с некоторым избыточным кодом, но по-прежнему хорошо разбирается в том, как реализовать клавиатуры, которые не подходят к обычным клавиатурам «кнопка-текст».

ОБНОВЛЕНИЕ

Хорошо, теперь я смог успешно интегрировать выдвижную клавиатуру эмодзи в свой собственный проект 8Vim после значительного повторного факторинга в обоих проектах.

По сути, все, что вы делаете для клавиатуры эмодзи, — это создаете представление размера клавиатуры, а затем заполняете это представление файлами PNG, соответствующими эмодзи. каждое изображение действует как кнопка и доставляет соответствующие эмодзи в inputConnection.

ОБНОВЛЕНИЕ 2

Я расширил скользящие эмодзи -keyboard и создал более понятную версию, которая должна быть проще для понимания. Взгляните на мою клавиатуру смайликов



Как получить смайлы на свой телефон Android

Сара Якобссон Пурувал/CNET

В то время как Android изначально был немного медленнее делать смайлики столь же обычным явлением, как Apple, это не значит, что вы не можете быть частью крутой компании, если вы не являетесь пользователем iPhone.

Важное замечание, которое может спасти вашу социальную жизнь: смайлики могут выглядеть по-разному на разных телефонах. Даже странно. В этой статье Mental Floss показано, как смайлики отображаются на разных устройствах. Помните об этом, когда отправляете текстовые сообщения своим друзьям на iPhone.

Шаг 1. Убедитесь, что ваше устройство Android может видеть смайлики.

Некоторые устройства Android даже не могут видеть символы эмодзи — если ваши друзья с iPhone продолжают отправлять вам текстовые сообщения, которые отображаются в виде квадратов, это вы.

Если вы не уверены, поддерживает ли ваше устройство смайлики, вы можете легко узнать, открыв веб-браузер и выполнив поиск по запросу «смайлики» в Google. Если ваше устройство поддерживает смайлики, вы увидите в результатах поиска несколько смайликов. Если этого не произойдет, вы увидите несколько квадратов.

Этот телефон поддерживает эмодзи.

Скриншот Сары Якобссон Purewal/CNET

Если ваше устройство не поддерживает эмодзи, вы все равно можете получить их с помощью стороннего приложения для обмена сообщениями в социальных сетях, например WhatsApp или Line. Однако вы сможете видеть смайлики только внутри этих приложений; любые полученные SMS-сообщения по-прежнему не будут отображать их.

Шаг 2. Включите клавиатуру эмодзи

Даже если ваше устройство Android поддерживает эмодзи, ваша клавиатура по умолчанию может не включать их. Если у вас Android 4.4 или выше, на стандартной клавиатуре Google есть опция смайликов (просто введите слово, например «улыбка», чтобы увидеть соответствующие смайлы). Вы можете изменить клавиатуру по умолчанию, перейдя в Настройки> Язык и ввод> По умолчанию и выбрав клавиатуру, которую хотите использовать.

Измените клавиатуру по умолчанию в меню настроек. Снимок экрана, сделанный Сарой Якобссон Purewal/CNET

Вы можете переключаться между клавиатурами, проводя вниз, чтобы открыть область уведомлений , и нажимая Выбрать метод ввода .

Измените текущую клавиатуру в области уведомлений. Снимок экрана, сделанный Сарой Якобссон Purewal/CNET

Вы можете переключаться между клавиатурами только во время набора текста в области текстового поля, но вы будете знать это, потому что маленький значок клавиатуры появится в вашем Панель уведомлений .

Когда вы видите этот значок, вы можете смени клавиатуру. Снимок экрана Сары Якобссон Purewal/CNET

Если вы используете устройство Samsung, клавиатура Samsung по умолчанию имеет встроенные смайлы, к которым вы можете получить доступ, нажав и удерживая кнопку микрофона, а затем нажав смайлик значок лица.

Шаг 3. Загрузите клавиатуру стороннего производителя

Если на вашем устройстве нет клавиатуры со встроенными смайликами, вы можете загрузить сторонняя клавиатура. Наиболее очевидным выбором является Google Keyboard (доступна для всех устройств Android под управлением 4.0 и выше), но другие клавиатуры, такие как Swype, SwiftKey и Minuum, также имеют встроенные смайлы.

Emojis!

Скриншот Сары Якобссон Пурувал/CNET

Наконец, небольшое предупреждение : Если ваш тарифный план для текстовых сообщений ограничен, вы можете проверить, отправляет ли ваше устройство смайлы в виде символов (то есть символов Юникода), а не в виде MMS или графических сообщений..

символ >

Оцените статью
logicle.ru
Добавить комментарий