前言
用TextView顯示Html圖文,每一個(gè)需求都是需要探索的铐然,不再是簡(jiǎn)單的添加點(diǎn)擊事件就可以了搀暑。
1自点、如何添加點(diǎn)擊事件
這里要使用上在Html.forHtml()方法中的第四個(gè)參數(shù):Html.TagHandler。顧名思義就是標(biāo)簽處理的類术唬。
charSequence = Html.fromHtml(article.getContent(), Html.FROM_HTML_MODE_LEGACY, new DetailImageGetter(this, contentView), new DetailTagHandler(this));
然后就是創(chuàng)建這個(gè)自定義處理類了:
public class DetailTagHandler implements Html.TagHandler {
private Context context;
private ArrayList<String> strings;
public DetailTagHandler(Context context) {
this.context = context;
strings = new ArrayList<>();
}
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
// 處理標(biāo)簽<img>
if ("img".equals(tag.toLowerCase(Locale.getDefault()))) {
// 獲取長(zhǎng)度
int len = output.length();
// 獲取圖片地址
ImageSpan[] images = output.getSpans(len - 1, len, ImageSpan.class);
String imgURL = images[0].getSource();
// 記錄所有圖片地址
strings.add(imgURL);
// 記錄是第幾張圖片
int position = strings.size()-1;
// 使圖片可點(diǎn)擊并監(jiān)聽(tīng)點(diǎn)擊事件
output.setSpan(new ClickableImage(context, position), len - 1, len,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
private class ClickableImage extends ClickableSpan {
private Context context;
private int position;
public ClickableImage(Context context, int position) {
this.context = context;
this.position = position;
}
@Override
public void onClick(View widget) {
Intent intent = new Intent(context, PhotoActivity.class);
intent.putStringArrayListExtra("url", strings);
intent.putExtra("position", position);
context.startActivity(intent);
}
}
}
簡(jiǎn)單的說(shuō)明一下设捐,
1萝招、handleTag()
這個(gè)方法是在Html解析Html的時(shí)候調(diào)用的即寒,這里是處理了“img“標(biāo)簽逸爵,也可以在這里給其他標(biāo)簽自定義內(nèi)容师倔。方法里的代碼已經(jīng)給出了注釋趋艘,沒(méi)什么好說(shuō)的瓷胧。
2搓萧、ClickableImage類
這個(gè)內(nèi)部類就是監(jiān)聽(tīng)圖片點(diǎn)擊的瘸洛,需要傳遞什么數(shù)據(jù)直接放進(jìn)來(lái)就好了反肋。
2、查看圖片
我使用的是Github上的第三方圖片查看控件PhotoView畅形。
貼下地址:
github地址:https://github.com/chrisbanes/PhotoView
集成:
在projects的build中:
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
在module的build中:
compile 'com.github.chrisbanes:PhotoView:1.3.0'
然后就是用ViewPager和適配器來(lái)顯示PhotoView了铃在。
PhotoView的使用方法和圖片加載方法:
@Override
public Object instantiateItem(ViewGroup container, int position) {
View contentView = LayoutInflater.from(context).inflate(R.layout.item_photo, container, false);
final PhotoView photoView = (PhotoView) contentView.findViewById(R.id.item_photo_view);
final PhotoViewAttacher photoViewAttacher = new PhotoViewAttacher(photoView);
Glide.with(context)
.load(data.get(position))
.asBitmap()
.placeholder(R.drawable.banner_holder)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
photoView.setImageBitmap(resource);
photoViewAttacher.update();
}
});
container.addView(contentView);
return contentView;
}
這里用ViewPager的話需要注意一個(gè)問(wèn)題:
在縮放的時(shí)候會(huì)遇到崩潰的情況。
java.lang.IllegalArgumentException: pointerIndex out of range
這是android系統(tǒng)自身的原因揣炕,如果要改的話就需要去修改底層庫(kù)畸陡,另外一種解決方法就是抓取這個(gè)異常丁恭,處理掉墓陈。
那么在哪里處理這個(gè)異常呢贡必?一下子很難去找到抓取的點(diǎn)仔拟。
其實(shí)只要在事件分發(fā)的角度去考慮就行了理逊,自定義一個(gè)ViewPager去重寫事件分發(fā)方法:
public class PhotoViewPager extends ViewPager {
public PhotoViewPager(Context context) {
super(context);
}
public PhotoViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
try {
return super.onTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
}
好了!到這里就大功告成了羡洛。
3欲侮、總結(jié)
在用TextView顯示Html圖文的時(shí)候威蕉,需要自己去改的東西太多了韧涨,經(jīng)常把自己卡住虑粥,但只要有了靈活的思維娩贷,很多問(wèn)題其實(shí)很簡(jiǎn)單可以解決彬祖。