动态生成图文混排“本地添加”
在网上找了不少,但是总是没找到一个自己喜欢的,也适合自己的。但通过不同的方法综合起来,就有了自己想要的了。
一、可用HTML+TextView实现图文混排
页面main.XML只需要一个 TextView标签即可
1.android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
Source: 需处理的html文本
private TextView mText; mText = (TextView)findViewById(R.id.mtext); mText.setMovementMethod(ScrollingMovementMethod.getInstance());//如果需要滚动条,可以已这种方式添加
String msource = "<img src='abc'>";//为了方便查找,就不加文件后缀了 mEditText.append(Html.fromHtml(msource,imgGetter,null));
imageGetter :对图片处理(处理html中的图片标签)
Html.ImageGetter imgGetter = new Html.ImageGetter() { public Drawable getDrawable(String source) {//通过source得到中的img的src内容 Log.e("<img src='",source+"'/>");//打印获取到的内容 Drawable drawable = null; drawable = ContextCompat.getDrawable(getApplicationContext(), getImageByReflect(source)//文件反射机制,从文件名反射成ID );//从本地添加图片到drawable中,这种方法是很好,但是要注意你图片的大小,如果太大会发生OOM(Out Of Memory Error)。可替换成下一条已注释代码
/*drawable = new BitmapDrawable(getResources(),
decodeSampledBitmapFromResource(getResources(),//Resources
getImageByReflect(source),//图片的ID
300,300)//生成后的图片长宽
);*/
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable .getIntrinsicHeight()); return drawable; } };
/**
*逆向获取图片的Id
* @param imageName
* @return id
* return 0 is error or not find
*/
private Integer getImageByReflect(String imageName){
Integer id = 0;
try {
Field field = Class.forName("com.andyidea.tabdemo.R$drawable").getField(imageName);//文件位置
id = field.getInt(field);取得id
} catch (Exception e) {
}
return id;
}
/**
*图片压缩
* @param res
* @param resId
* @param reqWidth
* @param reqHeight
* @return 返回自定义大小的图片
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
tagHandler :对标签进行处理(相当于自定义的标签处理,在这里面可以处理自定义的标签)这里就不多讲它了
二、采用ImageView+TextView+ScrollView
main.XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white"> <ScrollView android:layout_width="fill_parent" android:layout_height="match_parent" android:id="@+id/scrollView"> <LinearLayout android:id="@+id/scrollView_linearLayout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="fill_horizontal" android:paddingLeft="20dp" android:paddingRight="20dp" > </LinearLayout> </ScrollView> </LinearLayout>
标签初始化
private LinearLayout linearLayout; linearLayout = (LinearLayout)findViewById(R.id.scrollView_linearLayout);
对linerlayout里边添加图片及文字
//这个方法最容易出现OOM,所以如果图片过多,最好图片大小设置得越小越好。当然,如果图片多,也可以循环 public void setLinearLayout(int first,int last){ ImageView img; TextView textView;
//可从这开始循环 img = new ImageView(this);//创建Image textView = new TextView(this);//创建Text img.setScaleType(ImageView.ScaleType.FIT_START);//设置图片显示方式可以去查看ScaleType的属性 img.setAdjustViewBounds(true); img.setImageBitmap( decodeSampledBitmapFromResource(getResources(),R.drawable.one//图片ID如果只知道文件名称的话是可以使用getImageByReflect()
,250,200)//图片压缩,上面已经给出了方法 ); textView.setTextSize(16);//设置字号 textView.setTextColor(this.getResources().getColor(R.color.black));//设置字体颜色 textView.setText(R.String.OK);//文字ID linearLayout.addView(img); linearLayout.addView(textView); }
三、如果要加载内存中的图片的话,只需要在方法中src使用本地图片的位置即可。
如要转载请注明出处<!--俊-->http://www.cnblogs.com/Jung/p/5546492.html
不要为现在着想,要为将来!