package com.yaoyumeng.v2ex.ui.widget;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.yaoyumeng.v2ex.utils.Html;
import com.yaoyumeng.v2ex.Application;
import com.yaoyumeng.v2ex.ui.PhotoViewActivity;
import com.yaoyumeng.v2ex.utils.AsyncImageGetter;
import com.yaoyumeng.v2ex.utils.NetWorkHelper;
import java.util.ArrayList;
/**
* Created by yw on 2015/5/10.
*/
public class RichTextView extends TextView {
public RichTextView(Context context) {
super(context);
}
public RichTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RichTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setRichText(String text) {
setTextIsSelectable(true);
//移动网络情况下如果设置了不显示图片,则遵命
if (NetWorkHelper.isMobile(getContext()) && !Application.getInstance().isLoadImageInMobileNetworkFromCache()) {
super.setText(Html.fromHtml(text));
setMovementMethod(LinkMovementMethod.getInstance());
return;
}
Spanned spanned = Html.fromHtml(text, new AsyncImageGetter(getContext(), this));
SpannableStringBuilder htmlSpannable;
if (spanned instanceof SpannableStringBuilder) {
htmlSpannable = (SpannableStringBuilder) spanned;
} else {
htmlSpannable = new SpannableStringBuilder(spanned);
}
ImageSpan[] spans = htmlSpannable.getSpans(0, htmlSpannable.length(), ImageSpan.class);
final ArrayList<String> imageUrls = new ArrayList<String>();
final ArrayList<String> imagePositions = new ArrayList<String>();
for (ImageSpan span : spans) {
final String imageUrl = span.getSource();
final int start = htmlSpannable.getSpanStart(span);
final int end = htmlSpannable.getSpanEnd(span);
imagePositions.add(start + "/" + end);
imageUrls.add(imageUrl);
}
for(ImageSpan span : spans){
final int start = htmlSpannable.getSpanStart(span);
final int end = htmlSpannable.getSpanEnd(span);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
PhotoViewActivity.launch(getContext(), imagePositions.indexOf(start + "/" + end), imageUrls);
}
};
ClickableSpan[] clickSpans = htmlSpannable.getSpans(start, end, ClickableSpan.class);
if(clickSpans != null && clickSpans.length != 0) {
for(ClickableSpan c_span : clickSpans) {
htmlSpannable.removeSpan(c_span);
}
}
htmlSpannable.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
super.setText(htmlSpannable);
setMovementMethod(LinkMovementMethod.getInstance());
}
}