android html图片点击事件,Android TextView加载HTMl图文之添加点击事件和查看图片
前言
用TextView顯示Html圖文,每一個需求都是需要探索的,不再是簡單的添加點擊事件就可以了。
1、如何添加點擊事件
這里要使用上在Html.forHtml()方法中的第四個參數:Html.TagHandler。顧名思義就是標簽處理的類。
charSequence = Html.fromHtml(article.getContent(), Html.FROM_HTML_MODE_LEGACY, new DetailImageGetter(this, contentView), new DetailTagHandler(this));
然后就是創建這個自定義處理類了:
public class DetailTagHandler implements Html.TagHandler {
private Context context;
private ArrayList strings;
public DetailTagHandler(Context context) {
this.context = context;
strings = new ArrayList<>();
}
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
// 處理標簽
if ("img".equals(tag.toLowerCase(Locale.getDefault()))) {
// 獲取長度
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;
// 使圖片可點擊并監聽點擊事件
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);
}
}
}
簡單的說明一下,
1、handleTag()
這個方法是在Html解析Html的時候調用的,這里是處理了“img“標簽,也可以在這里給其他標簽自定義內容。方法里的代碼已經給出了注釋,沒什么好說的。
2、ClickableImage類
這個內部類就是監聽圖片點擊的,需要傳遞什么數據直接放進來就好了。
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和適配器來顯示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() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation super Bitmap> glideAnimation) {
photoView.setImageBitmap(resource);
photoViewAttacher.update();
}
});
container.addView(contentView);
return contentView;
}
這里用ViewPager的話需要注意一個問題:
在縮放的時候會遇到崩潰的情況。
java.lang.IllegalArgumentException: pointerIndex out of range
這是android系統自身的原因,如果要改的話就需要去修改底層庫,另外一種解決方法就是抓取這個異常,處理掉。
那么在哪里處理這個異常呢?一下子很難去找到抓取的點。
其實只要在事件分發的角度去考慮就行了,自定義一個ViewPager去重寫事件分發方法:
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、總結
在用TextView顯示Html圖文的時候,需要自己去改的東西太多了,經常把自己卡住,但只要有了靈活的思維,很多問題其實很簡單可以解決。
總結
以上是生活随笔為你收集整理的android html图片点击事件,Android TextView加载HTMl图文之添加点击事件和查看图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android程序大牛,冲向大牛之安卓:
- 下一篇: android studio 导入项目卡