Emoji是什么
Emoji是一組Unicode編碼與一組表情描述之間一一對應(yīng)内颗,而圖片的實現(xiàn)是由各個系統(tǒng)或者軟件針對同一的表情描述來各自實現(xiàn)的瓦侮。
Emoji在Android中的使用
Emoji是通過Unicode統(tǒng)一編碼實現(xiàn)的后控,那么我們就可以使用Character.toChars()方法將Unicode編碼轉(zhuǎn)換為一個char數(shù)組薇芝,再將這個char數(shù)組轉(zhuǎn)換為字符串就可以直接操作了,操作系統(tǒng)會自行將其解析為表情圖片的,然后顯示在文本組件中滥搭。
private void setEmojiToTextView(){
int unicodeJoy = 0x1F602;
String emojiString = getEmojiStringByUnicode(unicodeJoy);
myTextView.setText(emojiString);
}
private String getEmojiStringByUnicode(int unicode){
return new String(Character.toChars(unicode));
}
當然,這只是其中的一種方法捣鲸,我們還可以通過Emoji字體庫來實現(xiàn)效果瑟匆,將制作好Emoji字體庫拷貝到android工程的assets/fonts目錄,然后代碼中進行處理:
try {
Typeface typeFace = Typeface.createFromAsset(getResources().getAssets(),"fonts/AndroidEmoji.ttf");
title.setTypeface(typeFace);
} catch (Exception e) {
Logger.e(e);
}
之后栽惶,當我們在該title控件上輸入Emoji表情的Unicode后會自動轉(zhuǎn)換為表情圖片愁溜。
禁止輸入Emoji的EditText
public class ForbidEmojiEditText extends EditText {
private Context mContext;
// 是否重置了EditText的內(nèi)容
private boolean resetText;
//光標位置
private int cursorPosition;
//輸入emoji之前文本內(nèi)容
private String inputAfterText;
public ForbidEmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, null);
}
public ForbidEmojiEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initEditText();
}
public ForbidEmojiEditText(Context context) {
super(context);
initEditText();
}
private void initEditText() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (!resetText) {
cursorPosition = getSelectionEnd();
//這里用s.toString而不直接用s
//是因為String是引用數(shù)據(jù)類型,如果直接用s的話外厂,指向的地址是同一個
// 當s改變了inputAfterText也改變冕象,那么表情過濾失敗
inputAfterText = s.toString();
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!resetText){
//表情符號長度至少為2
if (count >= 2){
CharSequence input = s.toString().subSequence(cursorPosition,cursorPosition+count);
if (isContainsEmoji(input.toString())){
resetText = true;
Toast.makeText(getContext(), "不支持輸入表情符號", Toast.LENGTH_SHORT).show();
setText(inputAfterText);
CharSequence text = getText();
if (null != text){
Selection.setSelection((Spannable) text,text.length());
}
}
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* 檢查是否包含Emoji
*
* @return
*/
private static boolean isContainsEmoji(String source) {
for (int i = 0;i<source.length();i++){
char c = source.charAt(i);
if (isEmojiCharacter(c)){// 如果不能匹配,則該字符是Emoji表情
return true;
}
}
return false;
}
/**
* 判斷單個字符是否為emoji字符
* @return
*/
private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) ||
(codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000)
&& (codePoint <= 0x10FFFF));
}
}