图片toast_Android实现带插入图片的EditText功能

效果图:

0786f23b48bba5e09a1d7711d7c3df31.gif

我们来看看怎么实现,首先我们肯定是在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) {
           
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值