在Android应用开发时,显示图片是经常遇到的一个操作。下面看看在TextView中添加图片的一些方法。
1、利用SpannableString实现的主要代码是:
TextView textViewImage = (TextView) findViewById(R.id.textView2); ImageSpan imageSpan = new ImageSpan(this, R.drawable.a); SpannableString spannableString = new SpannableString("一棵参天大树!"); spannableString.setSpan(imageSpan, spannableString.length() - 1, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); textViewImage.setText(spannableString);
效果如图:
****有没有发现我们文字部分的感叹号“!”没有显示出来!!!『4.0的模拟器』****
解决办法之一是在需要显示文字后多添加一个空格,这样就不会影响到我们希望显示的文字内容!:)
如果希望把图片显示在文字中间,不仅可以使用TextView的append方法,还可以借助SpannableStringBuilder来实现。代码如下:
TextView textViewImage = (TextView) findViewById(R.id.textView2); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); ImageSpan imageSpan1 = new ImageSpan(this, R.drawable.a); SpannableString spannableString1 = new SpannableString("一棵参天大树!"); spannableString1.setSpan(imageSpan1, spannableString1.length() - 1, spannableString1.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); ImageSpan imageSpan = new ImageSpan(this, R.drawable.b); SpannableString spannableString2 = new SpannableString(" "); spannableString2.setSpan(imageSpan, spannableString2.length() - 1, spannableString2.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); spannableStringBuilder.append(spannableString1); spannableStringBuilder.append("=^_^="); spannableStringBuilder.append(spannableString2); textViewImage.setText(spannableStringBuilder);
效果如图:
说明:
- 使用append追加想要显示的内容;
- 追加的=^_^=完全显示,没有出现最后一个字符不能显示的问题;
2、利用Html.ImageGetter格式化图片:
- Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)方法可以通过ImageGetter对HTML中的Image标签中的src属性做处理,通过TagHandler对HTML中的标签做处理。利用前者,返回遵循一定协议的图片资源来进行显示。本例希望显示assets下的图片资源,故创建一个assetsImageGetter来做相关处理;
- TextView的setText方法,设置格式化后的内容并显示;
看看assetsImageGetter内都做了什么处理:
private Html.ImageGetter assetsImageGetter = new Html.ImageGetter() { public Drawable getDrawable(String source) { Drawable drawable = null; InputStream inputStream = null; try { inputStream = getAssets().open(source); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); drawable = new BitmapDrawable(bitmap); drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); bitmap = null; } catch (Exception e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return drawable; } };
说明:
- source即从img标签中提取到的src字符串,为了实现对assets下文件的处理,在调用时,需要给出assets文件夹下的图片路径;
- 通过BitmapFactory.decodeStream();获得对应的图片资源;
- 如果是网络图片,在此需要获得网络图片资源;
调用方法:
TextView textViewImage = (TextView) findViewById(R.id.textView2); String html = "(:<img src='a.jpg'/>AND<img src='b.jpg'/>:)"; CharSequence richText = Html.fromHtml(html, assetsImageGetter, null); textViewImage.setText(richText);
说明:
- 调用方法中图片的地址从assets目录开始;
- 使用时,必须把图片地址设置到img标签中的src属性中;
运行效果如下:
3、利用TextView的setCompoundDrawables方法,可以设置四种环绕的图片:
主要代码如下:
textViewImage = (TextView) findViewById(R.id.textView2); // 设置被环绕的文字 textViewImage.setText("=^_^="); // 为了看到效果而设置一些属性 textViewImage.setPadding(20, 10, 20, 10); textViewImage.setBackgroundColor(Color.GRAY); textViewImage.setGravity(Gravity.CENTER); // 设置环绕的图片 Drawable d = getResources().getDrawable(R.drawable.a); d.setBounds(0, 0, 60, 60); //必须设置图片大小,否则不显示 textViewImage.setCompoundDrawables(d , d, d, d);
效果如图:
多说一句:如果你原意,应该还可以想到其它方法,呵呵!:)