EditText Android实现的富文本编辑

  

<强>前言

  

本文是我之前写的这篇文章《Android图文混排,实现EditText图文混合插入上传》的升级版,除了在EditText实现了图片上传之外,还包含了视频上传,云盘文件上,传录音上传以及显示上传进度。目前应用于蜜蜂——集结号——任务模块。

  

首先介绍一下该功能的实现效果:
  

  

 Android实现EditText的富文本编辑

  

<>强实现思路

  

实现思路与之前介绍的稍有不同,但是依然是使用SpannableString实现的。由于这里不仅仅支持图片上传,还支持音频,视频,文件上传,为了以后方便扩展更多类型,这里不再使用标签实现,而是直接以JSON实现。以前的实现思路是" & lt; img url=" xxx.jpg“在”现,在每一个富文本元素都是“{“类型”:“视频”、“数据”:{“url”:“xxx。mp4”、“拇指”:“base64 str”、“大小”:1024}}”这样的字符串替换出来的,“类型”有“视频”,“音频”、“形象”、“文本”、“文件”等类型,针对不同类型,“数据”里面的字段也不同。“数据”里面一般包含文件名,文件大小,文件网络路径、音视频长度等字段。

  

图片或视频的上传进度改变时,切回主线程不断更新UI,所谓更新UI,其实就是不断的去替换这个SpannableString。对于各种样式的ImageSpan,实际上都是BitmapDrawable。

  

<>强实现富文本元素插入到EditText

  

实现代码如下:

        公共静态TaskSpan getAudioSpan(上下文语境,int类型,json字符串,字符串,int进展){   视图spanView=视图。充气(上下文,出来。bbs_audio_bar_tag, null);   LinearLayout llBg=(LinearLayout) spanView.findViewById (R.id.ll_bg);   ImageView icPlay=(ImageView) spanView.findViewById (R.id.iv_play);   ImageView icStop=(ImageView) spanView.findViewById (R.id.iv_stop);   TextView tvTime=(TextView) spanView.findViewById (R.id.tv_time);   ProgressBar proBar=(ProgressBar) spanView.findViewById (R.id.progress_bar);      开关(类型){   案例AUDIO_PLAY_NONE:   尝试{   最后一个String []=json.split分裂(BBSConstants.SPLIT_TAG);   JSONObject obj=new JSONObject ([1]);   最后的JSONObject data=https://www.yisu.com/zixun/obj.optJSONObject (Constants.RETURN_DATA);   int时间=data.optInt (BBSConstants.LONG_DATA_DURATION);      tvTime.setText (DateUtil。getDurationTime(时间/1000,假));   proBar.setProgress (0);   icPlay.setVisibility (View.VISIBLE);   icStop.setVisibility (View.GONE);   llBg.setBackgroundDrawable (context.getResources () .getDrawable (R.drawable.grey_bg_50dp_corner_no_border));   }捕捉(JSONException e) {   e.printStackTrace ();   }   打破;      案例AUDIO_PLAY_ING:   proBar.setProgress(进步);   icPlay.setVisibility (View.GONE);   icStop.setVisibility (View.VISIBLE);   llBg.setBackgroundDrawable (context.getResources () .getDrawable (R.drawable.blue_bg_50dp_corner_no_border));   tvTime.setText(时间);   打破;   }      BitmapDrawable可拉的=(BitmapDrawable) ViewUtil.convertViewToDrawable (spanView);   .getDisplayMetrics .getResources drawable.setTargetDensity (MyApplication.getInstance () () ());   最后的浮动比例=1.0 f/6.0 f;   最后一个int宽度=DeviceUtil.getScreenWidth((活动)上下文)- DeviceUtil。dip2px(上下文、长度);   浮子高度=(浮动)宽度*规模;   可拉的。setBounds(0, 0,宽度,(int)高度);   返回新TaskSpan(可拉的类型,json);      }   之前      

这里的TaskSpan继承了ImageSpan,将音频播放条这个视图转换成了可拉的,因此它就可以在EditText中显示了。同理图片,视频,文件的实现方式也是如此。

  

<>强实现富文本元素的点击事件

  

要做到点击视频跳转到视频播放页面,点击音频播放音频,点击文件跳转到文件预览页面,就必须给这些富文本元素添加点击事件。这里的通用实现就是自定义LinkMovementMethod:

        包com.gnet.uc.activity.appcenter;      进口android.text.Layout;   进口android.text.Selection;   进口android.text.Spannable;   进口android.text.method.LinkMovementMethod;   进口android.text.style.ClickableSpan;   进口android.view.MotionEvent;   进口android.widget.TextView;/* *   *集结号富文本跨度的点击事件   *   * @author lei.han   * @time 2017/6/20下午11   */公开课TaskMovementMethod延伸LinkMovementMethod {      公共布尔>   editText。setMovementMethod(新TaskMovementMethod ());   

EditText Android实现的富文本编辑