<强>前言强>
本文是我之前写的这篇文章《Android图文混排,实现EditText图文混合插入上传》的升级版,除了在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实现的富文本编辑