动态生成图文混排“本地添加”

在网上找了不少,但是总是没找到一个自己喜欢的,也适合自己的。但通过不同的方法综合起来,就有了自己想要的了。

一、可用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

posted @ 2016-05-31 17:02  Junger  阅读(368)  评论(0编辑  收藏  举报