安卓中的图文混排 ImageSpan SpannableStringBuffer

效果如图:

安卓中的图文混排 ImageSpan SpannableStringBuffer_第1张图片

代码实现:(把图片替换掉,可以直接拿来用)

package com.example.tuhuadmin.fanxinglei.widget;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ImageSpan;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.tuhuadmin.fanxinglei.R;
import com.example.tuhuadmin.fanxinglei.utils.DensityUtils;

/**
 * Created on 2016/8/14.
 * Author:crs
 * Description:XXX
 */
public class DeadLineActivity extends BaseActivity {

    private TextView tv;
    private String content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deadline);

        content = "希望岁月波澜有人陪,余生悲欢有人听.寂寞红尘,为情所困.";
        tv = (TextView) findViewById(R.id.tv);

        //处理具体的业务逻辑
        process();
    }

    private void process() {

        //tag1与tag2是将被替代的文本,
        //要让图片替代指定的文字就要用ImageSpan
        //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)
        //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12
        //Drawable与Bitmap对象
        String tag1 = "活动商品";//空格用于分割多个标签
        content = content + " " + tag1;//拼接到一起

        int tag1Start = content.indexOf(tag1);//获取活动商品的起始位置
        int tag1End = tag1Start + tag1.length();//获取活动商品的结束位置

        //用于实现图文混排  (content 已经包含了tag1)
        SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(content);

        //获取“活动商品”图片的高度与宽度;行高,用于确定图片的高度  字体高度为15sp
        int lineHeight = DensityUtils.sp2px(this, 13);
        //把drawable图片资源解析成Bitmap对象
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cp_tag_activity);
        //获取图片资源的高度
        int width = bitmap.getWidth();

        //获取Drawable对象
        Drawable drawable = getResources().getDrawable(R.drawable.cp_tag_activity);
        if (drawable != null) {
            //这行代码主要用于设置矩形在坐标系的位置 左上右下
            drawable.setBounds(0, 0, width, lineHeight);
            //ALIGN_BASELINE  和文字的底部对齐
            ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
            //Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 不包括起始位置
            spannableStringBuilder.setSpan(imageSpan, tag1Start, tag1End, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setText(spannableStringBuilder);
        }

        //两个标签的情况
        if (true) {
            String tag2 = "不可用券";
            //中间加空格用于分割
            content = content + " " + tag2;
            int tag2Start = content.indexOf(tag2);
            int tag2End = tag2Start + tag2.length();
            SpannableStringBuilder ssb = new SpannableStringBuilder(content);

            //获取长宽高度
            Bitmap tag2Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cp_tag_notavali);
            int tag2Width = tag2Bitmap.getWidth();
            Drawable tag2Drawable = getResources().getDrawable(R.drawable.cp_tag_notavali);
            if (drawable != null && tag2Drawable != null) {
                drawable.setBounds(0, 0, width, lineHeight);
                tag2Drawable.setBounds(0, 0, tag2Width, lineHeight);
                ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
                ImageSpan imageSpan2 = new ImageSpan(tag2Drawable, ImageSpan.ALIGN_BASELINE);
                ssb.setSpan(imageSpan, tag1Start, tag1End, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                ssb.setSpan(imageSpan2, tag2Start, tag2End, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(ssb);
            }
        }
    }
}



你可能感兴趣的:(安卓中的图文混排 ImageSpan SpannableStringBuffer)