Реализация эмодзи (смайлик) вид / раскладки клавиатуры
Я пытаюсь выяснить, как Emoji (смайлик) выборы осуществляются на Facebook приложение и Google Hangouts приложение. Я заглянул в SoftKeyboard демонстрационное приложение в образцах API Android, но отображение этих представлений emoji не похоже на SoftKeyboard. Он выглядит и ведет себя больше как обычай Dialog вид. Кто-нибудь имеет представление о том, как они реализуются?
Facebook App

Google Hangouts приложение

и Unicode лучший способ отправить смайлики или есть альтернатива? Я заметил, что некоторые Unicode последовательности типа u1F601 не визуализируйте соответствующий смайлик, и вместо этого эта последовательность просто отображается как 1:
EditText messageInput = (EditText) findViewById(R.id.message_input);
messageInput.getText().append("u1F601");
6 ответов:
Я нашел очень полезным Смайлик Клавиатура. Эта клавиатура использует не последовательности Юникода, а только локальные ресурсы изображений. Я думаю, что этот тип клавиатуры может быть полезен только в этом приложении, а не с другими приложениями или операционными системами.
поэтому вместо этого я заменяю
ImageViewсодержащий актив сTextViewсодержит последовательность Юникода.после перекрестной ссылки Поддерживаемые Последовательности Юникода а также Визуальные Базы Данных Unicode понял, что
\u1F601было 32-битное представление Юникода, и 16-битное представление может быть установлено следующим образом:EditText messageInput = (EditText) findViewById(R.id.message_input); messageInput.getText().append("\ud83d\ude01");
вы можете использовать эту библиотеку на основе библиотеки hieu Rocker: https://github.com/ankushsachdeva/emojicon
вот как это выглядит
viewgroup быть видимым или исчезли также может relize, что он не neet диалог. Каждый раз, когда инициализирую эмоцию, я всегда использую ключевое значение, такое как [happy]=R. drawable.счастливый. это текст к эмоциям в то время как содержание, как [счастливый]
public SpannableString textToImage(String content,Context c){ SpannableString ss = new SpannableString(content); int starts = 0; int end = 0; if(content.indexOf("[", starts) != -1 && content.indexOf("]", end) != -1){ starts = content.indexOf("[", starts); end = content.indexOf("]", end); SharedPreferences shared=c.getSharedPreferences("emotion",0); int resource=shared.getInt(content,0); try { Drawable drawable =c.getResources().getDrawable(resource); if (drawable != null) { drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, starts,end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } catch (Exception ex){ } } return ss; }
если вы не хотите вдаваться в подробности о том, как реализовать функциональность Emoji-Keyboard, вы можете попробовать эти библиотеки:
Rockerhieu / emojicon: реализует Emoji-клавиатуру с использованием фрагментов (вам нужно будет обрабатывать его отображение с помощью DialogFragment. Он не имеет поддержки для изменения макета и по умолчанию один отверстие темная тема;
Android Emoji Клавиатура: на основе работы Rockerhieu я построил еще один lib, который обеспечивает emoji-клавиатуру как можно ближе к тому, что мы видели в таких приложениях, как WhatsApp или Telegram. Вы можете обрабатывать макет как LinearLayout и, следовательно, обрабатывать взаимодействие с мягкой клавиатурой самостоятельно (как описано ниже) или выбрать использование панели Telegram или панели WhatsApp, предоставленной библиотекой, которая делает это за вас.
PS1: обе библиотеки Apache Лицензия
часть 01: построение макета
создайте GridView для каждой Emoji-страницы, которую вы хотите на своей клавиатуре. Например:
свяжите созданные представления во фрагменты:
public class FragmentEmojiNature extends FragmentEmoji { public static final String TAG = "FragmentEmojiNature"; private View mRootView; private Emoji[] mData; private boolean mUseSystemDefault = false; private static final String USE_SYSTEM_DEFAULT_KEY = "useSystemDefaults"; private static final String EMOJI_KEY = "emojic"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.mRootView = inflater.inflate(R.layout.frag_emoji_nature, container, false); return this.mRootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Parcelable[] parcels = bundle.getParcelableArray(EMOJI_KEY); mData = new Emoji[parcels.length]; for (int i = 0; i < parcels.length; i++) { mData[i] = (Emoji) parcels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); }}
создайте новый макет, содержащий пейджер вида и некоторый компонент для управления переходом пейджера вида (в моем случае я использовал третью часть библиотека
SmartTabLayoutкак показано ниже:<com.ogaclejapan.smarttablayout.SmartTabLayout android:id="@+id/emoji_tabs" android:layout_width="0dip" android:layout_height="40dip" android:layout_weight="1" app:stl_clickable="true" app:stl_defaultTabBackground="@color/rsc_emoji_tab_bkg" app:stl_defaultTabTextAllCaps="true" app:stl_defaultTabTextColor="#000" app:stl_defaultTabTextHorizontalPadding="0dip" app:stl_defaultTabTextMinWidth="0dp" app:stl_defaultTabTextSize="14sp" app:stl_distributeEvenly="true" app:stl_dividerColor="@color/rsc_emoji_tab_bkg" app:stl_drawDecorationAfterTab="true" app:stl_indicatorColor="@color/rsc_emoji_tab_indicator" app:stl_indicatorGravity="bottom" app:stl_indicatorInFront="false" app:stl_indicatorInterpolation="smart" app:stl_indicatorThickness="2dp" app:stl_overlineThickness="0dp" app:stl_titleOffset="24dp" app:stl_underlineThickness="0dp"/> <ImageButton android:id="@+id/backspace" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@color/rsc_emoji_tab_bkg" android:paddingLeft="10dip" android:paddingRight="10dip" android:src="@drawable/sym_keyboard_delete_holo_dark"/>PS2: кнопка выше существует для того, чтобы обеспечить функциональность backspace
Часть 02: слой контроллера
создайте адаптер для управления вставкой смайликов в GridView, например:
public class EmojiAdapter extends ArrayAdapter<Emoji> { private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTOR public EmojiAdapter(Context context, Emoji[] data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data) { super(context, R.layout.rsc_emoji_item, data); } public EmojiAdapter(Context context, List<Emoji> data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } public EmojiAdapter(Context context, Emoji[] data, boolean useSystemDefault) { super(context, R.layout.rsc_emoji_item, data); this.mUseSystemDefault = useSystemDefault; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { view = View.inflate(getContext(), R.layout.rsc_emoji_item, null); view.setTag(new ViewHolder(view, this.mUseSystemDefault)); } Emoji emoji = this.getItem(position); ViewHolder holder = (ViewHolder) view.getTag(); holder.icon.setText(emoji.getEmoji()); return view; } static class ViewHolder { EmojiTextView icon; public ViewHolder(View view, Boolean useSystemDefault) { this.icon = (EmojiTextView) view.findViewById(R.id.emoji_icon); this.icon.setUseSystemDefault(useSystemDefault); } } }создать классы, которые будут раздувать все emoji-страницы, передающие смайлики (по шаблону Unicode) в GridView. т. е.:
@Override public void onViewCreated(View view, Bundle savedInstanceState) { GridView gridView = (GridView) view.findViewById(R.id.Emoji_GridView); Bundle bundle = getArguments(); if (bundle == null) { mData = Nature.DATA; mUseSystemDefault = false; } else { Parcelable[] parcels = bundle.getParcelableArray(EMOJI_KEY); mData = new Emoji[parcels.length]; for (int i = 0; i < parcels.length; i++) { mData[i] = (Emoji) parcels[i]; } mUseSystemDefault = bundle.getBoolean(USE_SYSTEM_DEFAULT_KEY); } gridView.setAdapter(new EmojiAdapter(view.getContext(), mData, mUseSystemDefault)); gridView.setOnItemClickListener(this); }создайте два класса: один, который простирается от EditText и другой, который простирается от TextView. Перехватите вход каждого из них, чтобы определить, когда типизированный элемент является смайликом, если это так, добавьте spannable для отображения значка (в основном нужно, если вы хотите переопределить системные эмодзи по умолчанию, чтобы иметь что-то похожее что-приложение или телеграмма, например);
обрабатывать взаимодействие с программной клавиатурой. Это можно сделать двумя способами:
- нарисуйте диалог на мягкой клавиатуре;
- отключить взаимодействие мягкой клавиатуры с активностью и обрабатывать экран рисовать самостоятельно;
PS3: мне было трудно форматировать код, и все же некоторые XML не отображаются, если кто-то может это исправить я было бы благодарно
вы можете использовать эту библиотеку для Android: https://github.com/rockerhieu/emojicon
Случай 1 : Изготовленная На Заказ Кнопочная Панель Запустила Сперва Клавиатура создается на основе размера клавиатуры Android , так как эта клавиатура Высота неизвестна Изначально изготовленную на заказ кнопочную панель создается с фиксированной высотой - в этом случае вы должны двигаться редактирования над изготовленную на заказ кнопочную панель с фиксированной высотой ( которая может быть использована дополнение набора на родительском макет, где изменение площади помещается ( parentLayout->setPadding ( 0 , 0 , 0 ,высота) ->где высота вашей первоначальной высоты клавиатуры). Примечание: Не Забывайте чтобы установить заполнение в 0, когда пользовательская клавиатура уничтожена или скрыта.
case 2: текстовая клавиатура Android запускается первой
клавиатура известна запись в настройки при запуске пользовательской клавиатуры используйте эту высоту. Нет необходимости устанавливать какие-либо дополнения, потому что это то, что клавиатура Android делает для вас.


Comments