|
3 | 3 | import android.content.Context; |
4 | 4 | import android.os.Build; |
5 | 5 | import android.text.Editable; |
| 6 | +import android.text.InputFilter; |
6 | 7 | import android.text.InputType; |
| 8 | +import android.text.Spanned; |
7 | 9 | import android.text.TextUtils; |
8 | 10 | import android.text.TextWatcher; |
9 | 11 | import android.view.View; |
|
18 | 20 | import com.mylhyl.circledialog.view.listener.InputView; |
19 | 21 | import com.mylhyl.circledialog.view.listener.OnCreateInputListener; |
20 | 22 |
|
| 23 | +import java.util.regex.Pattern; |
| 24 | + |
21 | 25 | import static com.mylhyl.circledialog.res.values.CircleDimen.INPUT_COUNTER__TEXT_SIZE; |
22 | 26 |
|
23 | 27 | /** |
@@ -113,7 +117,7 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, int |
113 | 117 | } |
114 | 118 |
|
115 | 119 | if (inputParams.isEmojiInput) { |
116 | | - mEditText.addTextChangedListener(new EmojiWatcher(mEditText)); |
| 120 | + mEditText.setFilters(new InputFilter[]{new EmojiFilter()}); |
117 | 121 | } |
118 | 122 |
|
119 | 123 | OnCreateInputListener createInputListener = params.createInputListener; |
@@ -160,13 +164,6 @@ static boolean isChinese(String str) { |
160 | 164 | return isChinese; |
161 | 165 | } |
162 | 166 |
|
163 | | - static boolean isEmojiCharacter(char codePoint) { |
164 | | - return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) |
165 | | - || (codePoint == 0xD) || ((codePoint >= 0x20) && codePoint <= 0xD7FF)) |
166 | | - || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) |
167 | | - || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)); |
168 | | - } |
169 | | - |
170 | 167 | @Override |
171 | 168 | public EditText getInput() { |
172 | 169 | return mEditText; |
@@ -240,35 +237,49 @@ public void afterTextChanged(Editable editable) { |
240 | 237 | } |
241 | 238 | } |
242 | 239 |
|
243 | | - static class EmojiWatcher implements TextWatcher { |
244 | | - //监听改变的文本框 |
245 | | - private EditText mEditText; |
| 240 | + static class EmojiFilter implements InputFilter { |
| 241 | + Pattern emojiPattern = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", |
| 242 | + Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE); |
246 | 243 |
|
247 | | - public EmojiWatcher(EditText editText) { |
248 | | - this.mEditText = editText; |
| 244 | + public EmojiFilter() { |
249 | 245 | } |
250 | 246 |
|
251 | 247 | @Override |
252 | | - public void beforeTextChanged(CharSequence s, int start, int count, int after) { |
253 | | - |
| 248 | + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { |
| 249 | + if (this.emojiPattern.matcher(source).find() || containsEmoji(source)) { |
| 250 | + return ""; |
| 251 | + } |
| 252 | + return source; |
254 | 253 | } |
255 | 254 |
|
256 | | - @Override |
257 | | - public void onTextChanged(CharSequence s, int start, int before, int count) { |
258 | | - int index = mEditText.getSelectionStart() - 1; |
259 | | - mEditText.removeTextChangedListener(this); |
260 | | - if (index > 0) { |
261 | | - if (isEmojiCharacter(mEditText.getText().charAt(index))) { |
262 | | - Editable edit = mEditText.getText(); |
263 | | - edit.delete(start, start + count); |
| 255 | + /** |
| 256 | + * 检测是否有emoji表情 |
| 257 | + * |
| 258 | + * @param source |
| 259 | + * @return |
| 260 | + */ |
| 261 | + private static boolean containsEmoji(CharSequence source) { |
| 262 | + int len = source.length(); |
| 263 | + for (int i = 0; i < len; i++) { |
| 264 | + char codePoint = source.charAt(i); |
| 265 | + if (!isEmojiCharacter(codePoint)) { //如果不能匹配,则该字符是Emoji表情 |
| 266 | + return true; |
264 | 267 | } |
265 | 268 | } |
266 | | - mEditText.addTextChangedListener(this); |
| 269 | + return false; |
267 | 270 | } |
268 | 271 |
|
269 | | - @Override |
270 | | - public void afterTextChanged(Editable editable) { |
271 | | - |
| 272 | + /** |
| 273 | + * 判断是否是Emoji |
| 274 | + * |
| 275 | + * @param codePoint 比较的单个字符 |
| 276 | + * @return |
| 277 | + */ |
| 278 | + private static boolean isEmojiCharacter(char codePoint) { |
| 279 | + return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || |
| 280 | + (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || |
| 281 | + ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) |
| 282 | + && (codePoint <= 0x10FFFF)); |
272 | 283 | } |
273 | 284 | } |
274 | 285 | } |
0 commit comments