陪玩遊戲系統釋出動態,是怎麼新增話題標籤的

雲豹科技阿星發表於2021-09-07

新增話題,是陪玩遊戲系統的動態廣場的一項功能,本文介紹了,陪玩遊戲系統如何實現使用者輸入的時候自動識別是否輸入了標籤的。

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章