TextView加载html代码显示图片,并且支持图片放大功能
来源:互联网 发布:ant打包java配置文件 编辑:程序博客网 时间:2024/06/05 16:52
1.加载简单的html代码
textview.setText(Html.from(text));
2.加载图片显示,用的是imageloader加载图片,用as的可以直接在build.gradle里面加上
compile ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
不过这个需要在程序入口初始化一下,否则会报错
ImageLoader imageLoader = ImageLoader.getInstance();imageLoader.init(ImageLoaderConfiguration.createDefault(this));
重写ImageGetter,加载图片
public class URLImageParser implements ImageGetter { TextView mTextView; public URLImageParser(TextView textView) { this.mTextView = textView; } @Override public Drawable getDrawable(String source) { LogUtils.i("图片地址source:"+source); final URLDrawable urlDrawable = new URLDrawable(); ImageLoader.getInstance().loadImage(source, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { urlDrawable.bitmap = loadedImage; urlDrawable.setBounds(0, 0, loadedImage.getWidth(), loadedImage.getHeight()); mTextView.invalidate(); mTextView.setText(mTextView.getText()); } }); return urlDrawable; }}
public class URLDrawable extends BitmapDrawable { protected Bitmap bitmap; @Override public void draw(Canvas canvas) { if (bitmap != null) { canvas.drawBitmap(bitmap, 0, 0, getPaint()); } }}
在代码中设置一下就能显示图片了
URLImageParser imageGetter = new URLImageParser(textview);textview.setText(Html.fromHtml('要解析的字符串', imageGetter, null));
3.设置图片的可点击事件,使用到的是Html.fromHtml中的第三个参数TagHandler
还是要重写一下咯
public class MyTagHandler implements Html.TagHandler { private Context mContext; public MyTagHandler(Context context) { mContext = context.getApplicationContext(); } @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { // 处理标签<img> if (tag.toLowerCase(Locale.getDefault()).equals("img")) { // 获取长度 int len = output.length(); // 获取图片地址 ImageSpan[] images = output.getSpans(len - 1, len, ImageSpan.class); String imgURL = images[0].getSource(); // 使图片可点击并监听点击事件 output.setSpan(new ClickableImage(mContext, imgURL), len - 1, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } private class ClickableImage extends ClickableSpan { private String url; private Context context; public ClickableImage(Context context, String url) { this.context = context; this.url = url; } @Override public void onClick(View widget) { // 进行图片点击之后的处理 } }}
再设置一下就可以获得图片的点击事件啦
URLImageParser imageGetter = new URLImageParser(textview);MyTagHandler tagHandler = new MyTagHandler(this);//设置这个图片才能点击textview.setMovementMethod(LinkMovementMethod.getInstance());textview.setText(Html.fromHtml(returnHtml, imageGetter, tagHandler));
4.以上都是我在网上翻来翻去总结出来的啦,开始出现了加载两张图片超过一屏滑动有问题(其实是我太蠢了),哈哈,滑动嘛,在textview的外面套一个scrollview就可以了,如果不可以你也不能打我哦
5.找了很久发现都没有说好的点击图片放大呀,想了很久。。才想通。。不会是要我自己写放大图片的触发事件吧,虽然我很懒(忽略我的智商,假装是我懒),但是没有轮子还是要自己造轮子的嘛,那就造一个,以下图片放大纯属乱写,如果可以你不要夸我,不可以你也不要打我,有bug记得告诉我,啦啦啦。。。咳咳,开始写
还是在网上找的imageview图片缩放,我已经忘了作者是谁了。。反正不是我
import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;/** * 可以进行两指缩放,并且可以进行拖拉的ImageView最简单原生的实现 * * @author Seal * Created on 2014年5月15日 下午2:08:49 * @note */public class ScaleImageView extends ImageView { private float lastX, lastY;// 上一次记录的点 private float lastDistance;//上一次两点间的距离 public ScaleImageView(Context context, AttributeSet attrs) { super(context, attrs); } public ScaleImageView(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = event.getX(); lastY = event.getY(); break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount() == 2) {//两点触摸 final float disX = Math.abs(event.getX(0) - event.getX(1));//第一个点的偏移量 final float disY = Math.abs(event.getY(0) - event.getY(1));//第二个点的偏移量 final float dis = (float) Math.sqrt(disX * disX + disY * disY);//记录两点间的距离 if (lastDistance == 0) { lastDistance = dis;//记录第一次 } else { float scale = dis / lastDistance; lastDistance = dis;//替换上一次 scaleImage(scale); } } break; case MotionEvent.ACTION_UP: lastX = 0;//恢复初始化状态 lastY = 0; lastDistance = 0; break; default: break; } super.onTouchEvent(event); return true; } /** * 进行缩放 * * @param scale */ private void scaleImage(float scale) { final int width = getWidth(); final int newWidth = (int) (width * scale); final int height = getHeight(); final int newHeight = (int) (height * scale); LayoutParams params = getLayoutParams(); params.height = newHeight; params.width = newWidth; setLayoutParams(params); }}
没错现在缩放的控件已经有了那要怎么点击放大呢!!!我用了popupwindow
所以我重新写了一下MyTagHandler
/** * Created by ytt on 2016/12/9. */public class MyTagHandler implements Html.TagHandler { private Context mContext; private PopupWindow popupWindow; //需要放大的图片 private ScaleImageView tecent_chat_image; //加载中的进度条 private ProgressBar image_scale_progress; public MyTagHandler(Context context) { mContext = context.getApplicationContext(); View popView = LayoutInflater.from(context).inflate(R.layout.image_scale, null); tecent_chat_image = (ScaleImageView) popView.findViewById(R.id.image_scale_image); image_scale_progress= (ProgressBar) popView.findViewById(R.id.image_scale_progress); popView.findViewById(R.id.image_scale_rll).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(popupWindow!=null && popupWindow.isShowing()){ popupWindow.dismiss(); } } }); popupWindow = new PopupWindow(popView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); popupWindow.setFocusable(true); popupWindow.setOutsideTouchable(true);// 设置允许在外点击消失 ColorDrawable dw = new ColorDrawable(0x50000000); popupWindow.setBackgroundDrawable(dw); } @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { Log.i("ytp", "opening:" + opening); // 处理标签<img> if (tag.toLowerCase(Locale.getDefault()).equals("img")) { // 获取长度 int len = output.length(); // 获取图片地址 ImageSpan[] images = output.getSpans(len - 1, len, ImageSpan.class); String imgURL = images[0].getSource(); Log.i("ytp", "imgURL:" + imgURL); // 使图片可点击并监听点击事件 output.setSpan(new ClickableImage(mContext, imgURL), len - 1, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } private class ClickableImage extends ClickableSpan { private String url; private Context context; public ClickableImage(Context context, String url) { this.context = context; this.url = url; } @Override public void onClick(View widget) { // 进行图片点击之后的处理 Log.i("ytp", "点击了图片:url:" + url); image_scale_progress.setVisibility(View.VISIBLE); popupWindow.showAtLocation(widget, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); ImageLoader.getInstance().loadImage(url, new ImageLoadingListener(){ @Override public void onLoadingStarted(String imageUri, View view) { } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { tecent_chat_image.setImageBitmap(loadedImage); image_scale_progress.setVisibility(View.GONE); } @Override public void onLoadingCancelled(String imageUri, View view) { } }); } }}
还有一个popview R.layout.image_scale
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/image_scale_rll" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#66000000" android:clickable="true"> <cn.wangxiao.utils.ScaleImageView android:id="@+id/image_scale_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <ProgressBar android:id="@+id/image_scale_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/Widget.Holo.ProgressBar.Small" android:layout_centerInParent="true"/></RelativeLayout>
设置一下
URLImageParser imageGetter = new URLImageParser(textview);MyTagHandler tagHandler = new MyTagHandler(this);textview.setMovementMethod(LinkMovementMethod.getInstance());textview.setText(Html.fromHtml(returnHtml, imageGetter, tagHandler));
6.大功告成,噢耶,不知道有没有人看,反正我就乱写写,给自己么么哒,给看的你也么么哒~~毕竟我还在加班
不知道要写原创还是写转载,选择困难症,怎么办~~~原创?转载? 转载+原创?额,那我就脸皮厚一点选个原创?嗯!好的!
- TextView加载html代码显示图片,并且支持图片放大功能
- TextView加载Html并且显示图片
- Textview显示Html,图文混排,支持图片点击放大
- TextView显示html图片点击图片放大等操作
- TextView加载Html文本显示图片问题
- 论文中图片加方框并且放大显示 matlab代码
- 论文中图片加方框并且放大显示 matlab代码
- webview加载的html文件,图片如何放大显示?
- webview加载的html文件,图片如何放大显示?
- html图片上传阅览并且点击放大
- TextView使用html.fromhtml加载html并显示图片
- Android开发技巧——TextView加载HTML的图片及代码显示问题
- Android TextView 显示网络图片,点击放大
- Android TextView加载带有多张图片的HTML,并且解决图片造成的OOM
- 支持点击放大缩小图片,拖动放大缩小图片功能
- Android TextView 显示HTML代码以及代码中的图片标签
- TextView通过Html显示图片
- WebView页面上的图片点击的时候加载到Viewpager显示并且可以放大缩小
- spring学习笔记工厂模式
- iOS逆向 — 逆向微信,透视聊天背景
- maven在eclipse中自动化远程发布
- jQuery Mobile页面跳转后未加载JS解决办法
- 机器学习--Hoeffding Inequality--界定概率边界
- TextView加载html代码显示图片,并且支持图片放大功能
- 单例模式的另一种实现(内部类)
- 享元模式设计心得
- linux安装JDK1.8、tomcat8、Maven3.2、Scala2.10、Spark1.3.0
- org.apache.catalina.core.DefaultInstanceManager cannot be cast to org.apache.tomcat.InstanceManager
- 四天学会mongoDB (第四天 索引操作)
- 观察者模式(发布订阅模式)
- hive异常 java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7
- hive异常:创建MySQL时Specified key was too long; max key length is 1000 bytes