Skip to content

Commit 9d8b81a

Browse files
duom青源duom青源
authored andcommitted
2 parents 04faad2 + e4a5204 commit 9d8b81a

File tree

5 files changed

+72
-51
lines changed

5 files changed

+72
-51
lines changed

android/src/main/java/com/variabletextinput/VariableTextInputViewManager.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,17 +176,10 @@ public void receiveCommand(VariableTextInput root, int commandId, @Nullable Read
176176
root.blur();
177177
break;
178178
case 2:
179-
//插入emoji
180-
root.insertEmoji(args);
181-
break;
182179
case 3:
183-
//插入tag 或者@
184-
root.insertMentions(args);
185-
//todo
186-
break;
187180
case 4:
188181
//更改富文本
189-
//todo
182+
root.handleRichText(args);
190183
break;
191184
default:
192185
break;
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.variabletextinput.bean;
22

33
public class RichTextBean {
4-
public String name;
5-
public String id;
6-
public String tag;
7-
public int color;
8-
public String content;
9-
public int type; //0 插入表情 1插入@或者#
4+
public String name;//插入@用户名称或#话题
5+
public String id;//插入@用户id或#话题id
6+
public String tag;//富文本标识符
7+
public int color;//插入内容颜色
8+
public String content;//传给RN提交的内容
9+
public String text;//普通文本字符
10+
public int type;//0普通文本字符、1插入自定义表情、2插入@或者#话题
1011

1112
}

android/src/main/java/com/variabletextinput/util/ActivityConst.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@ public class ActivityConst {
55
public static final String ID = "id";
66
public static final String TAG = "tag";
77
public static final String COLOR = "color";
8+
public static final String TEXT = "text";
9+
public static final String TYPE = "type";
10+
public static final String EMOJI_TAG = "emojiTag";
811
}

android/src/main/java/com/variabletextinput/view/VariableTextInput.java

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import android.text.SpannableString;
1414
import android.text.SpannableStringBuilder;
1515
import android.text.Spanned;
16-
import android.text.TextUtils;
1716
import android.text.TextWatcher;
1817
import android.text.style.ImageSpan;
1918
import android.util.Log;
@@ -88,9 +87,15 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
8887
}
8988
if (editText.getText() != null) {
9089
TextSpan[] spans = editText.getText().getSpans(0, editText.getText().length(), TextSpan.class);
90+
ImageSpan[] spansImg = editText.getText().getSpans(0, editText.getText().length(), ImageSpan.class);
9191
//整体删除span
9292
if (before == 1 && count == 0) {
9393
for (TextSpan textSpan : spans) {
94+
if (editText.getText().getSpanEnd(textSpan) == start && !editText.getText().toString().endsWith(textSpan.getRichTextBean().name)) {
95+
editText.getText().delete(editText.getText().getSpanStart(textSpan), editText.getText().getSpanEnd(textSpan));
96+
}
97+
}
98+
for (ImageSpan textSpan : spansImg) {
9499
if (editText.getText().getSpanEnd(textSpan) == start) {
95100
editText.getText().delete(editText.getText().getSpanStart(textSpan), editText.getText().getSpanEnd(textSpan));
96101
}
@@ -312,64 +317,83 @@ public void insertImage(String imagePath) {
312317
editText.append(spannableString);
313318
}
314319

315-
public void insertMentions(ReadableArray args) {
316-
if (args != null && args.size() > 0) {
317-
RichTextBean richTextBean = handleParams(args);
318-
setMentionsSpan(richTextBean);
319-
}
320-
}
321-
322-
public void insertEmoji(ReadableArray args) {
320+
public void handleRichText(ReadableArray args) {
323321
if (args != null && args.size() > 0) {
324-
RichTextBean richTextBean = handleParams(args);
325-
int startIndex = editText.getSelectionStart();
326-
Log.e("startIndex", startIndex + "");
327-
int endIndex = startIndex + richTextBean.tag.length();
328-
Log.e("endIndex", endIndex + "");
329-
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kuxiao);
330-
ImageSpan imageSpan = new ImageSpan(mContext, bitmap);
331-
if (editText.getText() != null) {
332-
editText.getText().insert(startIndex, richTextBean.tag);
322+
for (int i = 0; i < args.size(); i++) {
323+
RichTextBean richTextBean = handleParams(args.getMap(i));
324+
switch (richTextBean.type) {
325+
case 0:
326+
//普通文本
327+
editText.setText(richTextBean.text);
328+
break;
329+
case 1:
330+
//自定义表情
331+
insertEmoji(richTextBean);
332+
break;
333+
case 2:
334+
//@或者#话题
335+
insertMentions(richTextBean);
336+
break;
337+
default:
338+
break;
339+
}
333340
}
334-
SpannableStringBuilder ss = SpannableStringBuilder.valueOf(editText.getText());
335-
ss.setSpan(imageSpan, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
336-
editText.setText(ss);
337-
editText.setSelection(endIndex);
338-
editText.getText().replace(startIndex, endIndex, richTextBean.content);
339341
}
340342
}
341343

342-
private RichTextBean handleParams(ReadableArray args) {
344+
private RichTextBean handleParams(ReadableMap map) {
343345
RichTextBean richTextBean = new RichTextBean();
344-
ReadableMap map = args.getMap(0);
346+
if (map.hasKey(ActivityConst.TYPE)) {
347+
richTextBean.type = map.getInt(ActivityConst.TYPE);
348+
}
345349
if (map.hasKey(ActivityConst.ID)) {
346350
richTextBean.id = map.getString(ActivityConst.ID);
347351
}
348352
if (map.hasKey(ActivityConst.TAG)) {
349-
String tag = map.getString(ActivityConst.TAG);
350-
//表情
351-
if (!TextUtils.isEmpty(tag) && tag.startsWith("[")) {
352-
richTextBean.tag = tag;
353-
richTextBean.content = String.format(mContext.getString(R.string.insert_emoji), tag.replaceAll("\\[|\\]", ""));
354-
} else {
355-
richTextBean.tag = tag;
356-
}
353+
richTextBean.tag = map.getString(ActivityConst.TAG);
354+
}
355+
if (map.hasKey(ActivityConst.EMOJI_TAG) && richTextBean.type == 1) {
356+
richTextBean.tag = map.getString(ActivityConst.EMOJI_TAG);
357+
richTextBean.content = String.format(mContext.getString(R.string.insert_emoji), richTextBean.tag.replaceAll("\\[|\\]", ""));
357358
}
358359
if (map.hasKey(ActivityConst.NAME)) {
359360
String name = map.getString(ActivityConst.NAME);
360361
richTextBean.name = name + " ";
361-
richTextBean.content = String.format(mContext.getString(R.string.insert_mention), richTextBean.tag, name, richTextBean.id);
362+
//插入@或者#
363+
if (richTextBean.type == 2) {
364+
richTextBean.content = String.format(mContext.getString(R.string.insert_mention), richTextBean.tag, name, richTextBean.id);
365+
}
362366
}
363367
if (map.hasKey(ActivityConst.COLOR)) {
364368
richTextBean.color = map.getInt(ActivityConst.COLOR);
365369
}
370+
if (map.hasKey(ActivityConst.TEXT)) {
371+
richTextBean.text = map.getString(ActivityConst.TEXT);
372+
}
366373
return richTextBean;
367374
}
368375

369-
private void setMentionsSpan(RichTextBean richTextBean) {
376+
public void insertEmoji(RichTextBean richTextBean) {
377+
int startIndex = editText.getSelectionStart();
378+
Log.e("startIndex", startIndex + "");
379+
int endIndex = startIndex + richTextBean.tag.length();
380+
Log.e("endIndex", endIndex + "");
381+
if (editText.getText() != null) {
382+
editText.getText().insert(startIndex, richTextBean.tag);
383+
}
384+
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kuxiao);
385+
ImageSpan imageSpan = new ImageSpan(mContext, bitmap);
386+
SpannableStringBuilder ss = SpannableStringBuilder.valueOf(editText.getText());
387+
ss.setSpan(imageSpan, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
388+
editText.setText(ss);
389+
editText.setSelection(endIndex);
390+
editText.getText().replace(startIndex, endIndex, richTextBean.content);
391+
}
392+
393+
private void insertMentions(RichTextBean richTextBean) {
370394
int startIndex = editText.getSelectionStart();
371395
Log.e("startIndex", startIndex + "");
372-
int endIndex = startIndex + richTextBean.name.length() + richTextBean.tag.length();
396+
int endIndex = startIndex + richTextBean.tag.length() + richTextBean.name.length();
373397
Log.e("endIndex", endIndex + "");
374398
if (editText.getText() != null) {
375399
editText.getText().insert(startIndex, richTextBean.tag + richTextBean.name);

android/src/main/java/com/variabletextinput/widget/TextSpan.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ private Bitmap getNameBitmap(String name) {
4949
Paint paint = new Paint();
5050
paint.setAntiAlias(true);
5151
//设置字体画笔的颜色
52-
paint.setColor(mContext.getResources().getColor(android.R.color.holo_red_dark));
52+
paint.setColor(mRichTextBean.color);
5353
//设置字体的大小
5454
paint.setTextSize(50);
5555
Rect rect = new Rect();

0 commit comments

Comments
 (0)