陪玩遊戲系統釋出動態,是怎麼新增話題標籤的
新增話題,是陪玩遊戲系統的動態廣場的一項功能,本文介紹了,陪玩遊戲系統如何實現使用者輸入的時候自動識別是否輸入了標籤的。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料安全,是陪玩遊戲系統時刻關注的問題遊戲
- 遊戲陪玩系統開發,Java怎樣實現流合併?遊戲Java
- 抖音怎麼新增話題?抖音新增話題或建立話題方法教程
- 遊戲陪玩APP遊戲APP
- jq動態生成的元素(標籤)新增點選事件事件
- 透過websocket,實現遊戲陪玩系統的聊天室Web遊戲
- jQuery基礎學習(3)(獲取標籤屬性,動態新增標籤)jQuery
- 關於遊戲陪玩系統效能優化的9大策略和6大指標遊戲優化指標
- 看看黑客是怎麼玩遊戲黑客遊戲
- 如何進行遊戲陪玩系統原始碼中音視訊的自動化測試?遊戲原始碼
- 遊戲陪玩系統,生成證書和金鑰庫的程式碼分析遊戲
- 遊戲陪玩系統開發,架構設計的開閉原則是如何實現的?遊戲架構
- tag標籤是怎麼用OT實現的?
- 關於遊戲陪玩系統原始碼後臺管理系統,需要思考的二三事遊戲原始碼
- 遊戲陪玩app開發,高併發系統如何設計?遊戲APP
- 如何在遊戲陪玩系統原始碼中實現“刮刮樂”效果?遊戲原始碼
- 如何實現遊戲陪玩系統原始碼前端效能監控?遊戲原始碼前端
- win10系統下玩劍靈遊戲出現卡頓怎麼解決Win10遊戲
- 遊戲陪玩,仍在途中遊戲
- 如何實現遊戲陪玩系統中語音的錄製與播放?遊戲
- 在遊戲陪玩系統開發中,如何進行效能測試?遊戲
- 什麼是遊戲陪玩app原始碼開發的過度設計,如何避免?遊戲APP原始碼
- windows10系統下怎麼離線玩遊戲Windows遊戲
- 遊戲陪玩系統開發,音視訊混流的實現程式碼遊戲
- 帶你瞭解遊戲陪玩系統原始碼前端常用的儲存方式遊戲原始碼前端
- 利用Easy UI生成非同步樹以及動態新增標籤頁UI非同步
- win10系統下怎麼新增紙牌遊戲Win10遊戲
- 遊戲陪玩系統開發,日期時間選擇介面的實現遊戲
- Win10系統全屏玩遊戲出現閃屏現象怎麼解決Win10遊戲
- 3·15釋出之手遊篇:你在玩遊戲還是遊戲在“玩”你?遊戲
- JavaScript 動態建立style標籤JavaScript
- 做好陪玩系統原始碼的前端效能優化,提升系統效能原始碼前端優化
- 什麼是JSTL標籤?常用的標籤庫有哪些?JS
- 遊戲陪玩系統實現自適應負載均衡演算法的方式遊戲負載演算法
- 遊戲陪玩系統原始碼中不同排序演算法的實現方式遊戲原始碼排序演算法
- 遊戲陪玩系統移動端網路優化思路,一起了解一下遊戲優化
- win10玩遊戲總是卡頓怎麼辦_win10玩遊戲卡頓是什麼原因Win10遊戲
- 玩遊戲卡怎麼辦? 玩遊戲卡的原因遊戲