Android textview 富文本给textview设置点赞点踩

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
String htmlText=“1、网络图片测试\r\n<img src=赞<img src=踩\r\n#\r\n2、结尾网络图片测试\r\n<img src=赞<img src=踩\r\n#\r\n3、结尾网络图片测试\r\n<img src=赞<img src=踩\r\n”;
String zan="<img src=赞";
String cai="<img src=踩";
htmlTextView = (TextView) findViewById(R.id.htmlTextView);
htmlTextView.setBackgroundColor(00000000);
stringBuilder = new SpannableStringBuilder();
String[] split = htmlText.split("#");
for (int i = 0; i < split.length; i++) {
setImage(split[i], zan, cai, htmlTextView);
}
htmlTextView.setText(stringBuilder);
htmlTextView.setHighlightColor(Color.TRANSPARENT);//消除点击时的背景色
htmlTextView.setMovementMethod(LinkMovementMethod.getInstance());

}

private void setImage(String htmlText, String zan, String cai, TextView htmlTextView) {
SpannableStringBuilder span = new SpannableStringBuilder(htmlText);
ClickSpan clickZanSpan = new ClickSpan(zan,this);
span.setSpan(clickZanSpan, htmlText.indexOf(zan),
htmlText.indexOf(zan) + zan.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    ClickSpan clickCaiSpan = new ClickSpan(cai,this);
    span.setSpan(clickCaiSpan, htmlText.indexOf(cai),
            htmlText.indexOf(cai) + cai.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    //设置ImageSpan,占用可点击文字("icon")的位置
    Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.zan);
    BitmapDrawable drawableZan = new BitmapDrawable(bitmap);
    drawableZan.setBounds(50, 50, bitmap.getWidth()+50, bitmap.getHeight()+50);

    Bitmap bitmapcai=BitmapFactory.decodeResource(getResources(),R.mipmap.cai);
    BitmapDrawable drawableCai = new BitmapDrawable(bitmapcai);
    drawableCai.setBounds(50, 50, bitmap.getWidth()+50, bitmap.getHeight()+50);

    span.setSpan(new VerticalImageSpan(drawableZan),
            htmlText.indexOf(zan), htmlText.indexOf(zan) + zan.length(),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    span.setSpan(new VerticalImageSpan(drawableCai),
            htmlText.indexOf(cai), htmlText.indexOf(cai) + cai.length(),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    htmlTextView.setText(span);
    stringBuilder.append(span);

}

public class ClickSpan extends ClickableSpan {
private String txt;
private Context context;

public ClickSpan(String txt,Context context){
    this.txt = txt;
    this.context=context;
}
@Override
public void onClick(View widget) {
    if (txt!=null&&!TextUtils.isEmpty(txt)){
        if (txt.contains("赞")){
            Toast.makeText(context,"点赞",Toast.LENGTH_LONG).show();
        }else if (txt.contains("踩")){
            Toast.makeText(context,"点踩",Toast.LENGTH_LONG).show();
        }
    }

}

@Override
public void updateDrawState(TextPaint ds) {
    //根据自己的需求定制文本的样式
    ds.setColor(ds.linkColor);
    ds.setUnderlineText(false);
}

}

public class VerticalImageSpan extends ImageSpan {

public VerticalImageSpan(Drawable drawable) {
    super(drawable);
}

public int getSize(Paint paint, CharSequence text, int start, int end,
                   Paint.FontMetricsInt fontMetricsInt) {
    Drawable drawable = getDrawable();
    Rect rect = drawable.getBounds();
    if (fontMetricsInt != null) {
        Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
        int fontHeight = fmPaint.bottom - fmPaint.top;
        int drHeight = rect.bottom - rect.top;

        int top = drHeight / 2 - fontHeight / 4;
        int bottom = drHeight / 2 + fontHeight / 4;

        fontMetricsInt.ascent = -bottom;
        fontMetricsInt.top = -bottom;
        fontMetricsInt.bottom = top;
        fontMetricsInt.descent = top;
    }
    return rect.right;
}

@Override
public void draw(Canvas canvas, CharSequence text, int start, int end,
                 float x, int top, int y, int bottom, Paint paint) {
    Drawable drawable = getDrawable();
    canvas.save();
    int transY = 0;
    transY = ((bottom - top) - drawable.getBounds().bottom) / 2 + top;
    canvas.translate(x, transY);
    drawable.draw(canvas);
    canvas.restore();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值