陪玩遊戲系統釋出動態,是怎麼新增話題標籤的
新增話題,是陪玩遊戲系統的動態廣場的一項功能,本文介紹了,陪玩遊戲系統如何實現使用者輸入的時候自動識別是否輸入了標籤的。
public class TagEditTextView extends AppCompatEditText {
private int preTextLength = 0;
// 預設,話題文字高亮顏色
private static final int FOREGROUND_COLOR = Color.parseColor("#ffa500");
// 預設,話題背景高亮顏色
private static final int BACKGROUND_COLOR = Color.parseColor("#C8C8C8");
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
for (Topic t : tag_list) {
if (s.toString().contains(String.format("#%s#", t.name)) && t.can_publish == 1) {
setObject(t, true);
}
}
}
@Override
public void afterTextChanged(Editable s) {
Editable editable = getText();
int length = s.toString().length();
//刪除
if (length < preTextLength) {
int selectionStart = getSelectionStart();
int selectionEnd = getSelectionEnd();
/*
* 如果游標起始和結束不在同一位置,刪除文字
*/
if (selectionStart != selectionEnd) {
// 查詢文字是否屬於話題物件,若是移除列表資料
String tagetText = getText().toString().substring(selectionStart, selectionEnd);
for (int i = 0; i < mTObjectsList.size(); i++) {
Topic object = mTObjectsList.get(i);
if (tagetText.equals(object.name)) {
mTObjectsList.remove(object);
}
}
return;
}
int lastPos = 0;
if (mTObjectsList != null && mTObjectsList.size() > 0) {
// 遍歷判斷游標的位置
for (int i = 0; i < mTObjectsList.size(); i++) {
String objectText = mTObjectsList.get(i).name;
lastPos = getText().toString().indexOf(objectText, lastPos);
if (lastPos != -1) {
if (selectionStart != 0 && selectionStart >= lastPos && selectionStart <= (lastPos + objectText.length())) {
// 選中話題
setSelection(lastPos, lastPos + objectText.length());
// 設定背景色
editable.setSpan(new BackgroundColorSpan(
mBackgroundColor), lastPos, lastPos
+ objectText.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return;
}
lastPos += objectText.length();
}
}
}
}
preTextLength = length;
refreshEditTextUI(editable.toString());
}
};
// 話題文字高亮顏色
private int mForegroundColor = FOREGROUND_COLOR;
// 話題背景高亮顏色
private int mBackgroundColor = BACKGROUND_COLOR;
private List<Topic> mTObjectsList = new ArrayList<>();// object集合
private List<Topic> tag_list = new ArrayList<>();
public TagEditTextView(Context context) {
super(context);
init();
}
public TagEditTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TagEditTextView);
mBackgroundColor = typedArray.getColor(R.styleable.TagEditTextView_tag_background, BACKGROUND_COLOR);
mForegroundColor = typedArray.getColor(R.styleable.TagEditTextView_tag_color, FOREGROUND_COLOR);
typedArray.recycle();
init();
}
public TagEditTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TagEditTextView);
mBackgroundColor = typedArray.getColor(R.styleable.TagEditTextView_tag_background, BACKGROUND_COLOR);
mForegroundColor = typedArray.getColor(R.styleable.TagEditTextView_tag_color, FOREGROUND_COLOR);
typedArray.recycle();
init();
}
/**
* 監聽游標的位置,若游標處於話題內容中間則移動游標到話題結束位置
*/
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
super.onSelectionChanged(selStart, selEnd);
if (mTObjectsList == null || mTObjectsList.size() == 0) {
return;
}
int startPosition = 0;
int endPosition = 0;
String objectText = "";
for (int i = 0; i < mTObjectsList.size(); i++) {
objectText = mTObjectsList.get(i).name;
int length = getText().toString().length();
while (true) {
// 獲取話題文字開始下標
startPosition = getText().toString().indexOf(objectText, startPosition);
endPosition = startPosition + objectText.length();
if (startPosition == -1) {
break;
}
// 若游標處於話題內容中間則移動游標到話題結束位置
if (selStart > startPosition && selStart <= endPosition) {
if ((endPosition + 1) > length) {
setSelection(endPosition);
} else {
setSelection(endPosition + 1);
}
break;
}
startPosition = endPosition;
}
}
}
public void setAutoAddTag(List<Topic> tag_list) {
this.tag_list = tag_list;
}
private void init() {
this.addTextChangedListener(textWatcher);
}
private void refreshEditTextUI(String content) {
/*
* 內容變化時操作:
* 1.查詢匹配所有話題內容
* 2.設定話題內容特殊顏色
*/
if (mTObjectsList.size() == 0)
return;
if (TextUtils.isEmpty(content)) {
mTObjectsList.clear();
return;
}
/*
* 重新設定span
*/
Editable editable = getText();
int textLength = editable.length();
int findPosition = 0;
for (int i = 0; i < mTObjectsList.size(); i++) {
final Topic object = mTObjectsList.get(i);
// 文字
String objectText = object.name;
while (findPosition <= length()) {
// 獲取文字開始下標
findPosition = content.indexOf(objectText, findPosition);
if (findPosition != -1) {
// 設定話題內容前景色高亮
ForegroundColorSpan colorSpan = new ForegroundColorSpan(mForegroundColor);
editable.setSpan(colorSpan, findPosition, findPosition + objectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
findPosition += objectText.length();
} else {
break;
}
}
}
}
/**
* 插入/設定話題
*
* @param object 話題物件
*/
public void setObject(Topic object, boolean isAuto) {
if (isAuto) {
removeTextChangedListener(textWatcher);
}
String objectRule = "#";
if (object == null) {
return;
}
if (object.name.startsWith("#") && object.name.endsWith("#")) {
objectRule = "";
}
String objectText = object.name;
if (TextUtils.isEmpty(objectText)) {
return;
}
// 拼接字元# %s #,並儲存
objectText = objectRule + objectText + objectRule;
object.name = objectText.trim();
/*
* 1.新增話題內容到資料集合
*/
mTObjectsList.add(object);
/*
* 2.將話題內容新增到EditText中展示
*/
// 游標位置
int selectionStart = getSelectionStart();
// 原先內容
Editable editable = getText();
if (selectionStart >= 0) {
// 在游標位置插入內容 話題後面插入空格,至關重要
editable.insert(selectionStart, objectText + " ");
// editable.insert(getSelectionStart(), " ");
setSelection(getSelectionStart());// 移動游標到新增的內容後面
}
if (isAuto) {
init();
}
}
/**
* 獲取object列表資料
*/
public List<Topic> getObjects() {
List<Topic> objectsList = new ArrayList<Topic>();
// 由於儲存時候文字內容新增了匹配字元#,此處去除,還原資料
if (mTObjectsList != null && mTObjectsList.size() > 0) {
for (int i = 0; i < mTObjectsList.size(); i++) {
Topic object = mTObjectsList.get(i);
String objectText = object.name;
String objectRule = "#";
object.name = objectText.replace(objectRule, "");// 將匹配規則字元替換
objectsList.add(object);
}
}
return objectsList;
}
}
宣告:本文由雲豹科技轉發自GlimerOnHerFace部落格,如有侵權請聯絡作者刪除
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982461/viewspace-2790865/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料安全,是陪玩遊戲系統時刻關注的問題遊戲
- 遊戲陪玩APP遊戲APP
- 遊戲陪玩系統開發,Java怎樣實現流合併?遊戲Java
- 透過websocket,實現遊戲陪玩系統的聊天室Web遊戲
- 關於遊戲陪玩系統效能優化的9大策略和6大指標遊戲優化指標
- 遊戲陪玩系統,生成證書和金鑰庫的程式碼分析遊戲
- 如何進行遊戲陪玩系統原始碼中音視訊的自動化測試?遊戲原始碼
- 遊戲陪玩,仍在途中遊戲
- 3·15釋出之手遊篇:你在玩遊戲還是遊戲在“玩”你?遊戲
- 關於遊戲陪玩系統原始碼後臺管理系統,需要思考的二三事遊戲原始碼
- 遊戲陪玩系統開發,架構設計的開閉原則是如何實現的?遊戲架構
- 遊戲陪玩app開發,高併發系統如何設計?遊戲APP
- 如何實現遊戲陪玩系統原始碼前端效能監控?遊戲原始碼前端
- 如何實現遊戲陪玩系統中語音的錄製與播放?遊戲
- 遊戲陪玩系統原始碼開發,如何實現圖片和動畫的優化?遊戲原始碼動畫優化
- 在遊戲陪玩系統開發中,如何進行效能測試?遊戲
- windows10系統下怎麼離線玩遊戲Windows遊戲
- 帶你瞭解遊戲陪玩系統原始碼前端常用的儲存方式遊戲原始碼前端
- 遊戲陪玩系統開發,音視訊混流的實現程式碼遊戲
- win10系統下怎麼新增紙牌遊戲Win10遊戲
- 抖音怎麼新增話題?抖音新增話題或建立話題方法教程
- 來玩遊戲嗎?能線上陪玩的那種。遊戲
- 什麼是遊戲陪玩app原始碼開發的過度設計,如何避免?遊戲APP原始碼
- 如何在遊戲陪玩系統原始碼中實現“刮刮樂”效果?遊戲原始碼
- 遊戲陪玩系統開發,日期時間選擇介面的實現遊戲
- 遊戲陪玩系統原始碼中不同排序演算法的實現方式遊戲原始碼排序演算法
- 遊戲陪玩系統實現自適應負載均衡演算法的方式遊戲負載演算法
- win10系統下玩劍靈遊戲出現卡頓怎麼解決Win10遊戲
- Win10系統出現HDR遊戲問題怎麼修復Win10遊戲
- win10系統怎麼新增遊戲搖桿【圖文】Win10遊戲
- 遊戲陪玩系統移動端網路優化思路,一起了解一下遊戲優化
- 遊戲陪玩系統原始碼中懶載入的實現方式有哪幾種?遊戲原始碼
- Win10系統玩Supraland遊戲出現問題如何解決Win10遊戲
- 月入五位數?遊戲陪玩真這麼好賺?遊戲
- win10玩遊戲總是卡頓怎麼辦_win10玩遊戲卡頓是什麼原因Win10遊戲
- tag標籤是怎麼用OT實現的?
- 如何在遊戲陪玩系統原始碼中聊天室內實現一個禮物系統?遊戲原始碼
- 遊戲陪玩原始碼的移動端適配,應該如何實現?遊戲原始碼