解析微信输入@某人效果实现

Screenshot_2022-09-14-14-00-15-45_e39d2c7de19156b.jpg

首先看微信的效果

当选中@的人的时候,EditText里面填充 @东东娃,这个比较简单,但是有2个细节

1、按表情面板删除按钮或者中文键盘删除按钮的时候,会直接删除整个 @东东娃 这个整体

2、按英文键盘删除按钮的时候 是逐步删除 @东东娃 > @东东 > @东 > @ >

因此简单的通过setText("@东东娃") 就不太满足需求,因此我们需要自定义
CharacterStyle

废话不说上代码

1、比如合适的时候调用 appendAtSpan("@东东娃");

public void appendAtSpan(String atText){

    Editable editable = messageEditText.getEditableText();

    Spannable spannable = new SpannableString(atText);

    spannable.setSpan(new TextImageSpan(), 0, atText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    editable.insert(messageEditText.getSelectionStart(),spannable);

 }

2、自定义文字Span

按表情面板删除按钮或者中文键盘删除按钮的时候,会直接删除整个 @东东娃 这个整体

package com.farsunset.hoxin.common.widget.span;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.style.ReplacementSpan;

public class TextImageSpan extends ReplacementSpan {
    
    @Override
    public int getSize(Paint paint, CharSequence text,int start,int end,Paint.FontMetricsInt fm) {
        String spanText = text.subSequence(start,end).toString();
        return (int) paint.measureText(spanText);

    }

    @Override
    public void draw(Canvas canvas, CharSequence text,int start,int end, float x,
                     int top, int y, int bottom,  Paint paint) {
        String spanText = text.subSequence(start,end).toString();
        canvas.drawText(spanText, x, y, paint);
    }
}

3、一键删除整个整体

public void onDeleteEmoticonClicked() {
    KeyEvent keyEventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
    messageEditText.onKeyDown(KeyEvent.KEYCODE_DEL, keyEventDown);
}

自定义实现的效果

1、选择要at的人

Screenshot_2022-09-14-14-21-24-01_0d77d35623cd3f9.jpg

2、显示效果

Screenshot_2022-09-14-14-21-52-97_0d77d35623cd3f9.jpg

你可能感兴趣的:(解析微信输入@某人效果实现)