Android 模仿新浪微博“@”功能

Android 模仿新浪微博“@”功能

项目中有个部分需要模仿新浪微博的@功能:

  1. 输入@符号之后进入好友列表
  2. 点击某个人,返回这个人的信息,并以@xxx的格式显示在 EditText 中
  3. @部分需要变色
  4. 删除的时候需要把“@xxx”整体直接删除

基于以上几点要求,我有个想法:

通过InputFilter判断用户输入,当有“@”符号输入时,跳转到好友列表页,返回用户信息之后,把文字转换成bitmap,用SpannableString 做实现后面的功能
下面上主要代码

这里是把文字转化成bitmap

private Bitmap getNameBitmap(String name) {

        /* 把@相关的字符串转换成bitmap 然后使用DynamicDrawableSpan加入输入框中 */

        name = "" + name;
        Paint paint = new Paint();
        paint.setColor(getResources().getColor(R.color.color_blue));
        paint.setAntiAlias(true);
        paint.setTextSize(30);
        Rect rect = new Rect();

        paint.getTextBounds(name, 0, name.length(), rect);

        // 获取字符串在屏幕上的长度
        int width = (int) (paint.measureText(name));

        final Bitmap bmp = Bitmap.createBitmap(width, rect.height(),
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bmp);

        canvas.drawText(name, rect.left, rect.height() - rect.bottom, paint);

        return bmp;
    }

获取EditText中的内容,并且根据规则,找出要@的人

private void setAtImageSpan(String nameStr) {

        String content = String.valueOf(mEditText.getText());
        if (content.endsWith("@") || content.endsWith("@")) {
            content = content.substring(0, content.length() - 1);
        }
        String tmp = content;

        SpannableString ss = new SpannableString(tmp);

        if (nameStr != null) {
            String[] names = nameStr.split(" ");
            if (names != null && names.length > 0) {
                for (String name : names) {
                    if (name != null && name.trim().length() > 0) {
                        final Bitmap bmp = getNameBitmap(name);

                        // 这里会出现删除过的用户,需要做判断,过滤掉
                        if (tmp.indexOf(name) >= 0
                                && (tmp.indexOf(name) + name.length()) <= tmp
                                        .length()) {

                            // 把取到的要@的人名,用DynamicDrawableSpan代替
                            ss.setSpan(
                                    new DynamicDrawableSpan(
                                            DynamicDrawableSpan.ALIGN_BASELINE) {

                                        @Override
                                        public Drawable getDrawable() {
                                            // TODO Auto-generated method stub
                                            BitmapDrawable drawable = new BitmapDrawable(
                                                    getResources(), bmp);
                                            drawable.setBounds(0, 0,
                                                    bmp.getWidth(),
                                                    bmp.getHeight());
                                            return drawable;
                                        }
                                    }, tmp.indexOf(name),
                                    tmp.indexOf(name) + name.length(),
                                    SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }
                    }
                }
            }
        }
        mEditText.setTextKeepState(ss);
    }

以上是主要的代码,完整的demo,点这里

你可能感兴趣的:(实践代码,Android,仿新浪微博,at功能)