Android--EditText/TextView 中添加图片,以及点击图片.

本文介绍了如何在Android的EditText或TextView中添加图片,并处理点击图片的事件。通过ImageSpan或自定义控件实现图片插入,利用EditText的点击事件或ClickableSpan监听图片点击。同时分析了两种处理方式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 添加图片利用ImageSpan来处理,也可以自定义控件继承ImageSpan,添加自定义属性,比如:imageUri,index这样在 后面来处理点击事件时,可以直接获取到uri来做相应的处理:获取原图,做成viewPager效果等…
如下是例子代码,可以参考:
一.MyImageSpan

public class MyImageSpan extends ImageSpan
{

    public int index;  //图片的下标
    public String path; //图片的url地址

    public int getIndex() {
        return index;
    }


    public void setIndex(int index) {
        this.index = index;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public MyImageSpan(Drawable d) {
        super(d);
    }

    public MyImageSpan(Context context, Bitmap b) {
        super(context, b);
    }

    public MyImageSpan(Drawable d, int verticalAlignment) {
        super(d, verticalAlignment);
    }

    public MyImageSpan(Drawable d, String source) {
        super(d, source);
    }

    public MyImageSpan(Context context, Uri uri) {
        super(context, uri);
    }

    public MyImageSpan(Context context, int resourceId) {
        super(context, resourceId);
    }

    public MyImageSpan(Context context, Bitmap b, int verticalAlignment) {
        super(context, b, verticalAlignment);
    }

    public MyImageSpan(Drawable d, String source, int verticalAlignment) {
        super(d, source, verticalAlignment);
    }

    public MyImageSpan(Context context, Uri uri, int verticalAlignment) {
        super(context, uri, verticalAlignment);
    }

    public MyImageSpan(Context context, int resourceId, int verticalAlignment) {
        super(context, resourceId, verticalAlignment);
    }

二、EditText中添加图片.

拍照获取:

 intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(!FileUtils.fileExists(FileUtils.toDayNoteResources()))
            {
                FileUtils.fileMkdirs(FileUtils.toDayNoteResources());
            }
            filePhotoName = new File(FileUtils.toDayNoteResources() + "/"+ FileUtils.getFileName(".jpg"));
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(filePhotoName));
            startActivityForResult(intent, CAMERA_IMAGE_NEW_PHOTO);

结果返回:

if (requestCode == CAMERA_IMAGE_NEW_PHOTO) 
        {//camera
            if (resultCode == RESULT_OK) {
                  if(filePhotoName!=null)
                  {
                 //LogUtil.info("文件路径.."+filePhotoName);
                 filesrc = filePhotoName.getAbsolutePath();
                 Bitmap originalBitmap = ImageUtils.getSmallBitmap(filesrc,10,100,100); 
                if(originalBitmap != null)
                {
                    attachImage(originalBitmap,filesrc);
                }else{
                    Toast.makeText(TaskEditActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();
                }
                  }
            }

attachImage方法:

/**
     * 添加图片的处理
     * @param originalBitmap 
     */
    private void attachImage(Bitmap bitmap,String path) 
    {
        bitmap = ImageUtils.resizeImage(bitmap,400,400);
        bitmapList.add(bitmap);
        MyImageSpan mSpan = new MyImageSpan(this, bitmap);
        mSpan.setIndex(count);
        mSpan.setPath(path);
        picList.add(mSpan);
        final SpannableString spannableString = new SpannableString(AppConfig.picReg);
        spannableString.setSpan(mSpan, 0, AppConfig.picReg.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        //handler 处理图片
        //在UI线程中利用handler来更新ui
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        Message msg = Message.obtain();
                        msg.what = TEXT_ADD_IMAGE;
                        msg.obj = spannableString;
                        handler.sendMessage(msg);
                    }
                }
                ).start();
    }

handler 处理

private final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) 
            {
            case TEXT_ADD_IMAGE:
                LogUtil.info("添加图片..");
                SpannableString ss = (SpannableString) msg.obj;
                int index = editInputText.getSelectionStart();
                Editable edit_text = editInputText.getEditableText();
                if(index <0 || index >= edit_text.length()){
                    edit_text.append(ss);
                }else{
                    edit_text.insert(index, ss);
                }
                //edit_text.append(ss);
                editInputText.getEditableText().append("\n");
                count++;
                //setSpanableClick();
            }
        }
    };

2、 图片点击有俩种方式来处理
一> 利用整个EditText,来添加点击事件,通过点击事件来获取该EditText中的所有MyImageSpan控件,主要是通过MyImageSpan数组进行存储,然后,遍历MyImageSpan数组,通过MyImageSpan.getImageUri来获取到前面设置的地址来做相应的操作,定位某个ImageSpan是通过获取当前文本的光标是否在当前ImageSpan的范围,通过ImageSpan的getSpanStart()和getSpanEnd()方法来获取.例子代码如下:

//  private OnClickListener textListener = new OnClickListener(){
//      @Override
//      public void onClick(View v) {
//          //关闭软键盘
//          InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//          imm.hideSoftInputFromInputMethod(editInputText.getWindowToken(), 0);
//          Spanned ss= editInputText.getText();
//          MyImageSpan[] imageSpans = ss.getSpans(0, ss.length(), MyImageSpan.class);
//          int selectStart = editInputText.getSelectionStart();
//          int cc=0;
//          //图片..
//          for(MyImageSpan span:imageSpans)
//          {
//              int start = ss.getSpanStart(span);
//              int end = ss.getSpanEnd(span);
//              if(selectStart>=start && selectStart<end)
//              {
//                  LogUtil.info("path:"+span.getPath());
//                  Bitmap bitmap = ((BitmapDrawable) span.getDrawable()).getBitmap();  
//                  if(span.getPath()==null)
//                  {
//                      span.setPath(picList.get(cc).getPath());
//                  }
//                   viewPicture(bitmap,Uri.fromFile(new File(span.getPath())));
//                   cc++;
//                   return;  
//              }
//          }

这种方式的缺点是:点击图片的开始是可以响应,但是点击图片结束是没有响应的..

二>,另一种方式主要是通过内部的ClickableSpan事件来实现,首先要setMovementMethod,不然后面的点击事件无法获取..
以下是实现例子代码

 Spanned s = editInputText.getText();
//        //setMovementMethod很重要,不然ClickableSpan无法获取点击事件。
//       editInputText.setMovementMethod(LinkMovementMethod.getInstance());
//        ImageSpan[] imageSpans = s.getSpans(0, s.length(), ImageSpan.class);
//        
//        for (ImageSpan span : imageSpans) {
//                final String image_src = span.getSource();
//                final int start = s.getSpanStart(span);
//                final int end = s.getSpanEnd(span);
//                //spanEnd = end;                      
//                //捕获到点击事件...
//                ClickableSpan click_span = new ClickableSpan() {
//                        @Override
//                        public void onClick(View widget) {
//                           editInputText.setCursorVisible(false);
//                                Toast.makeText(getApplicationContext(),
//                                                "Image Clicked " + filePath, Toast.LENGTH_SHORT)
//                                                .show();
//                                Intent intent = new Intent(Intent.ACTION_VIEW);  
//                                intent.setDataAndType(Uri.fromFile(new File(filePath)), "image/*");  
//                                startActivity(intent); 
//                                
//                        }
//                };
//
//                ClickableSpan[] click_spans = s.getSpans(start, end,
//                                ClickableSpan.class);              
//                if (click_spans.length != 0) {
//                        // remove all click spans
//                        for (ClickableSpan c_span : click_spans) {
//                                ((Spannable) s).removeSpan(c_span);
//                        }
//                }
//                ((Spannable) s).setSpan(click_span, start, end,
//                                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

优点是:只要点击即可获取,不管是点击前面还是后面,缺点的话,就是,我无法再获取其他事件了,比如说我插完图片以后,要添加文字,它会默认获取span的点击事件,进行相关的操作…
欢迎大家拍砖….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值