|
当初遇到这个问题时我想的很复杂,后来发现Android中已经提供了相应的解决办法。这些都是在实际开发中遇到的问题,希望大家共同学习,共同进步啊!
当初是要做游戏的聊天系统,要想QQ等其他软件一样能在输入框中输入不同颜色的文字中间还要有图片
就如下图
其实这一切都用到了HTML这个类,这要学过Html的都能得到自己想要的想过,主要是在实现过程中要注意下。
例如上图左边是一个TextView,右边是一个EditText,我们并不需要在布局文件中做什么特别的设置,所有的效果都是在程序中实现的。实现上图的效果的代码如下:
String ht = "www.baidu.com"
+ "<img src='" + R.drawable.icon + "' />"
+ "<font color='green'>sdsa</font>"
+ "<a href='baidu'>BaiDu</a>kjdjfakjkjeifaknk";
TextView test = (TextView) findViewById(R.id.txt);
EditText ed = (EditText) findViewById(R.id.edt);
ed.setText(Html.fromHtml(ht, getImageGetterInstance(), null), BufferType.SPANNABLE);
test.setText(Html.fromHtml(ht, getImageGetterInstance(), null));
这就是实现上图效果的主要代码。其中有几个问题要注意啊,可能有的人已经注意到了上面的代码中实现各种文字和图片的效果都是用的Html语言,所以要想实现这种效果就要会一点网页方面的知识(一点点,不会很难的!)。
再添加图片时,可以是项目drawable中的图片,也可以是assets中的图片,只不过我们要为Html.fromHtm()提供不同的ImageGetter对象罢了,即一上程序中getImageGetterInstance()的返回值,
若你想用图片的ID取用图片,那么可以用一下这个
public ImageGetter getImageGetterInstance() {
ImageGetter imgGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source);
Drawable d = getResources().getDrawable(id);
int height = fontH;
int width = (int) ((float) d.getIntrinsicWidth() / (float) d
.getIntrinsicHeight()) * fontH;
d.setBounds(0, 0, width, height);
return d;
}
};
return imgGetter;
} //其中fontH是字体高度,我只想让图片和字体等高,这样看起来舒服点
若果你想用其他位置的图片(无法使用ID)可以用下面的方法:
public ImageGetter getImageGetterInstance() {
ImageGetter imgGetter = new Html.ImageGetter()
{
public Drawable getDrawable(String url)
{
try
{
Bitmap bitmap = BitmapFactory.decodeStream(inputStream(url));
}
catch (Exception e)
{
e.printStackTrace();
Bitmap bitmap = null;
}
Drawable d = new BitmapDrawable(bitmap);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
return d;
}
};
return imgGetter;
}
当然,如果要使用assets中的图片时,在Html语句中就应该是文件的路径和名称了,例如
String ht="<img src='f/f0.png' />";
其实,Html类中提供了两个fromHtml()方法,其中一个只有一个参数:Html.fromHtml(String s),如果你不想添加图片就可以使用这个方法。
大家或许还注意到了我再给EditText中添加文字时用的是setText(Html.fromHtml(ht, getImageGetterInstance(), null), BufferType.SPANNABLE); 这个方法,为什么不直接用setText()方法呢?
我们在使用EditText时,大多都是想从中取出输入值,但是一旦我们采用了以上的方法在文字中添加不同颜色的字体和图片后,你从EditText中取出的就不是你看到的和开始写入的了,你会看到图片位置是一个没有见过的符号,而有颜色的字体也没有了颜色的标记。我使用这个setText方法就是为了让我们输入什么就取出出什么!
这个setText方法就是现指定输入的数据类型,将来取出时才可将其转化为什么类型(java中的向上向下转型的问题)。有心的人会发现其实Html.fromHtml()方法的返回值其实并不是String,而是Spanned。
我们输入(写入)的是Html语言,所以我们还要取出我们输入的Html语言方法如下
String html = Html.toHtml((Spannable) ed.getText());
这样我们就能得到原来的那一串文字了,不过在这床文字的前后分别被添加上了"<p>","</p>",不过这对我们来说应该就不是问题了吧!哈哈
一点小心得,献丑了,有问题请留言,我们一起学习一起进步! |
|