项目中需要这个效果:
就和人人网@用户的效果一样,一直没有思路,不知道怎样去完成这个功能。
后来想到一个想法就是使用Spannable完成,设置文字的背景色来达到这个效果,但删除不能删除整个用户名,会一个字一个字的删除。
后来偶然想到了使用ImageSpan来完成这个功能,就相当于在EditText中插入图片,要实现这个主要有两个问题:
1、字符串转换为图片。
2、EditText插入图片。
代码如下:
/**
* 获取图片并插入EditText
*/
private void insertEditText(String str){
Bitmap imgBitmap = Str2Bit.createBitmap(str);
if(imgBitmap != null){
//根据Bitmap对象创建ImageSpan对象
ImageSpan imageSpan = new ImageSpan(MainActivity.this, imgBitmap);
//创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
SpannableString spannableString = new SpannableString("[name]"+str+"[/name]");
// 用ImageSpan对象替换face
spannableString.setSpan(imageSpan, 0, ("[name]"+str+"[/name]").length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//将选择的图片追加到EditText中光标所在位置
int index = editText.getSelectionStart(); //获取光标所在位置
Editable edit_text = editText.getEditableText();
if(index <0 || index >= edit_text.length()){
edit_text.append(spannableString);
}else{
edit_text.insert(edit_text.length(), spannableString);
}
}else{
Log.i("MainActivity", "插入失败");
}
}
/**
* 字符串转换成图片
* @param str
* @return
*/
public static Bitmap createBitmap(String str) {
Bitmap bp = Bitmap.createBitmap(60, 30, Config.ARGB_8888); //画布大小
Canvas c = new Canvas(bp);
Paint paint1 = new Paint();
paint1.setColor(Color.BLACK);
c.drawColor(Color.BLUE);//画布颜色
Paint paint2 = new Paint();//画姓名前边的间隔
paint2.setColor(Color.WHITE);
paint2.setStrokeWidth(1f);
c.drawLine(0, 0, 0, 30, paint2);
Paint paint = new Paint();
paint.setTextSize(20);//字体大小
paint.setColor(Color.BLACK);//字体大小
paint.setFakeBoldText(true); //粗体
paint.setTextSkewX(0);//斜度
paint.setTextAlign(Paint.Align.CENTER);
c.drawText(str, 30, 20, paint);//文字位置
c.save( Canvas.ALL_SAVE_FLAG );//保存
c.restore();//
return bp;
}
具体效果自己改吧。
下载地址:http://pan.baidu.com/share/link?shareid=154636802&uk=1745678343