效果图:
我们来看看怎么实现,首先我们肯定是在EditText上进行扩展肯定是继承于EditText。我们用到的最主要的两个类是SpannableString和ImageSpan,通过这两个类,我们就能实现图片和文字共存,一般适用的场景是论坛或者帖子的发表或者提交
具体实现:
我们首先要用SpannableString来编辑要插入的图片内容
/** * 编辑插入的内容 * * @param picPath * @return */ private CharSequence getDrawableStr(String picPath) {
String str = ""; Bitmap bm = createImageThumbnail(picPath); final SpannableString ss = new SpannableString(str); // 定义插入图片 Drawable drawable = new BitmapDrawable(bm); float scenewidth = Util.getScene(Util.SCENE_WIDTH) / 3; float width = drawable.getIntrinsicWidth(); float height = drawable.getIntrinsicHeight(); if (width > scenewidth) {
width = width - 20; height = height - 20; } else {
float scale = (scenewidth) / width; width *= scale; height *= scale; } //设置图片的宽高 drawable.setBounds(2, 0, (int) width, (int) height); //ALIGN_BOTTOM 调整图片距离字有一定的间隙 VerticalCenterImageSpan span = new VerticalCenterImageSpan(drawable, 1); //SPAN_INCLUSIVE_EXCLUSIVE 会导致删除后面的文字消失 ss.setSpan(span, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); /* Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式 Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。 Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。 */ return ss; }
其中需要插入创建的图片,我把创建图片的代码单独拉出来了
/** * 创建图片 * @param filePath * @return */ public static Bitmap createImageThumbnail(String filePath) {
Bitmap bitmap = null; BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inTempStorage = new byte[100 * 1024]; // 默认是Bitmap.Config.ARGB_8888 opts.inPreferredConfig = Bitmap.Config.RGB_565; opts.inSampleSize = 2; try {
bitmap = BitmapFactory.decodeFile(filePath, opts); } catch (Exception e) {
} return bitmap; }
然后使用自定义的ImageSpan来调整图片的位置
public class VerticalCenterImageSpan extends ImageSpan {
public VerticalCenterImageSpan(Drawable d, int verticalAlignment) {
super(d, verticalAlignment); } @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {