EditText添加@功能

博客介绍了使用ImageSpan做@别人的标签,要求控制@标签只能放在文本最前,且光标只能在@标签后面。实现此功能需要监控光标位置,监听光标后获取[/at]的位置并将光标置于最后。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用ImageSpan做@别人的标签:

                ImageSpan imageSpan = new ImageSpan(mView.getContext(), imgBitmap);
                CharSequence source = "[at]" + replyData.getName() + "/" + replyData.getOpenid() + "[/at]";
                SpannableString spannableString = new SpannableString(source);
                spannableString.setSpan(imageSpan, 0, (source).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                Editable edit_text = mView.getReplyEditText().getEditableText();
                edit_text.insert(0, spannableString);
changeStringToBitmap方法:
            //文字属性
            TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
            //字体大小
            int fontSize = DisplayUtils.sp2px(mView.getContext(), 12);
            paint.setTextSize(fontSize);
            //字体颜色
            paint.setColor(Color.WHITE);
            paint.setTextAlign(Paint.Align.CENTER);
            //获取文字区域大小
            Rect rect = new Rect();
            paint.getTextBounds(data, 0, data.length(), rect);
            int fontWidth = rect.width();
            Paint.FontMetrics fontMetrics = paint.getFontMetrics();
            float fontBaseHeight = fontMetrics.bottom - fontMetrics.top;
            float textBaseY = fontBaseHeight - fontMetrics.bottom;
            //画布大小
            int canvasWidth = Double.valueOf(Math.ceil(fontWidth)).intValue();
            int canvasH = Double.valueOf(Math.ceil(fontBaseHeight)).intValue();
            Bitmap bitmap = Bitmap.createBitmap(canvasWidth, canvasH, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            Paint paintCanvas = new Paint();
            paintCanvas.setColor(Color.BLACK);
            canvas.drawColor(Color.GRAY);
            //文字位置
            canvas.drawText(data, canvasWidth / (float) 2.0, textBaseY, paint);
            canvas.save();//保存
            canvas.restore();
            return bitmap;

控制@标签只能放在text的最前,控制光标只能在@标签后面:

需要监控光标位置:

public class AtContentEditText extends android.support.v7.widget.AppCompatEditText {

    public interface onSelectionChangedListener {
        void onCursorChanged(int selStart, int selEnd);
    }

    private onSelectionChangedListener mSelectionChangedListener;

    public void setOnSelectionChangedListener(onSelectionChangedListener selectionChangedListener) {
        mSelectionChangedListener = selectionChangedListener;
    }

    public AtContentEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    @Override
    public void onSelectionChanged(int selStart, int selEnd) {
        super.onSelectionChanged(selStart, selEnd);
        if (mSelectionChangedListener != null) {
            mSelectionChangedListener.onCursorChanged(selStart, selEnd);
        }
    }
}

监听光标,获取[/at]的位置并把光标放在最后面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值