package me.yluo.ruisiapp.widget.htmlview; import android.content.Context; import android.graphics.Point; import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.WindowManager; import android.widget.TextView; import java.lang.ref.WeakReference; import me.yluo.ruisiapp.widget.htmlview.callback.ImageGetter; import me.yluo.ruisiapp.widget.htmlview.callback.SpanClickListener; import me.yluo.ruisiapp.widget.htmlview.callback.ViewChangeNotify; public class HtmlView implements ViewChangeNotify { private static final String TAG = HtmlView.class.getSimpleName(); public static final float LINE_HEIGHT = 1.4f; public static final int URL_COLOR = 0xff4078c0; public static float FONT_SIZE = 40; public static int VIEW_WIDTH = 1080; private String source; private ImageGetter imageGetter; private SpanClickListener clickListener; private boolean isViewSet; private Spanned spanned; private WeakReference<TextView> target; private HtmlView(String source) { this.source = source; isViewSet = false; } public static HtmlView parseHtml(String source) { return new HtmlView(source); } public HtmlView setImageGetter(ImageGetter imageGetter) { this.imageGetter = imageGetter; return this; } public HtmlView setSpanClickListener(SpanClickListener listener) { this.clickListener = listener; return this; } public void into(TextView target) { if (this.target == null) { this.target = new WeakReference<>(target); } if (imageGetter == null) { WindowManager wm = (WindowManager) target.getContext() .getSystemService(Context.WINDOW_SERVICE); Point p = new Point(); wm.getDefaultDisplay().getSize(p); VIEW_WIDTH = p.x - target.getPaddingStart() - target.getPaddingEnd(); imageGetter = new DefaultImageGetter(target.getContext(), VIEW_WIDTH); } if (clickListener == null) { clickListener = new DefaultClickHandler(target.getContext()); } FONT_SIZE = target.getTextSize(); spanned = SpanConverter.convert(source, imageGetter, clickListener, this); target.setMovementMethod(LinkMovementMethod.getInstance()); target.setLinkTextColor(URL_COLOR); target.setLineSpacing(0, LINE_HEIGHT); target.setText(spanned); isViewSet = true; } @Override public void notifyViewChange() { if (target == null) { return; } final TextView t = target.get(); if (isViewSet && t != null && spanned != null) { try { //这儿会有索引越界 t.removeCallbacks(updateRunable); t.postDelayed(updateRunable, 200); } catch (Exception ignored) { } } } private Runnable updateRunable = new Runnable() { @Override public void run() { final TextView t = target.get(); t.setText(spanned); Log.d(TAG, "notifyViewChange postInvalidateDelayed"); } }; }