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

来源:互联网 发布:旺旺淘宝网店铺激活 编辑:程序博客网 时间:2024/05/16 05:26

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,点这里

0 1
原创粉丝点击