EditText显示图片,删除图片,点击图片

此处将介绍EditText中图片和文本的混排、删除图片、并可以监听到点击图片的事件。


EditText中图片和文本的混排:


方法概述:获取图片的存储路径,添加<img/>标签,然后转成SpannableString,将SpannableString中的<img/>部分用 ImageSpan 替换。

e.g   图片路径 /mnt/sdcard/xxx.png,.添加<img/>之后就是<img src="/mnt/sdcard/xxx.png"/>  ,接下来的就直接看代码:

        mEtContent = (EditText) findViewById(R.id.et_content);
	mEtContent.append(getDrawableStr(picPath));

	private CharSequence getDrawableStr(String picPath) {
		InputStream is;
		try {
			String str = "<img src=\"" + picPath + "\"/>";
			is = new FileInputStream(picPath);
			BitmapFactory.Options opts = new BitmapFactory.Options();
			opts.inTempStorage = new byte[100 * 1024];
			opts.inPreferredConfig = Bitmap.Config.RGB_565; // 默认是Bitmap.Config.ARGB_8888
			opts.inSampleSize = 4;
			/* 下面两个字段需要组合使用 ,说是为了节约内存 */
			opts.inPurgeable = true;
			opts.inInputShareable = true;
			Bitmap bm = BitmapFactory.decodeStream(is, null, opts);

			final SpannableString ss = new SpannableString(str);
			// 定义插入图片
			Drawable drawable = new BitmapDrawable(bm);
			drawable.setBounds(2, 0, 400, 350);
			ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
			ss.setSpan(span, 0, ss.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
			return ss;
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}

	}

BitmapFactory.Options opts 是为了压缩图片的,大图片没经过处理容易OutOfMemoryError。通过设置BitmapFactory.Option的某些参数值可以修改图片的压缩比例。


这里还涉及到一个图片显示的问题:如,我通过上面的代码添加了几张图片,关闭应用后保存EidtText(mEtContent.getText().toString())中的内容,下一次打开的时候把这些内容显示出来再进行编辑。

方法概述:将保存的String中的<img/>标签都替换成ImageSpan就可以了。这里我用了一个递归方法:

        public static final String IMG_START = "<img src=\"";
	public static final String IMG_END = "\"/>";
	/**
	 * 从content解析出图片标签<img>,并设置到EditText中。
	 * 算法:假设 aaaaa, <img src="/mnt/sdcard/xxx.png"/> bbbbbbbb————<img src="/mnt/sdcard/yyyy.png/>dddddddd
	 * 改方法将“aaa”到第一个“/>”为止作为一个处理单元,然后再处理“bbbb”,到第二个“/>”,这两个步骤以及接下去的的处理方式其实是一样的,所以我用了递归。
	 * 
	 * @param etContent
	 * @param content
	 */
	private void updateContent(EditText etContent, String content) {
		//递归出口
		if(TextUtils.isEmpty(content)) {
			return;
		}
		Log.e(TAG, "content == " + content);
		
		int startIndex = 0, endIndex = 0;
		int imgStartIndex = content.indexOf(IMG_START);
		if(imgStartIndex < 0) {//没有<img>标签,说明没有图片了
			endIndex = content.length();
		} else {
			endIndex = imgStartIndex;
		}
		
		String str = content.substring(startIndex, endIndex);
		Log.e(TAG, "String1 == " + str);
		
		etContent.append(str);
		content = content.substring(endIndex, content.length());//将变量str表示的字符串删除
		Log.e(TAG, "content == " + content);
		
		//设置 img
		if(TextUtils.isEmpty(content)) {
			return;
		}
		
		int imgEndIndex = content.indexOf(IMG_END);		
		str = content.substring(IMG_START.length(), imgEndIndex);
		Log.e(TAG, "String2 == " + str);
		etContent.append(getDrawableStr(str));
		
		content = content.substring(imgEndIndex+IMG_END.length(), content.length());//将变量str表示的字符串删除
		Log.e(TAG, "content == " + content);
		updateContent(etContent, content);
		
	}

删除图片直接将光标指向图片后面,然后按删除键就可以了。


监听点击图片的事件

前面说到显示图片的方式是用ImageSpan替换<img/>标签。这里方法类似,是用ClickableSpan来替换<img/>标签。

	/**
	 * 将图片转成可在EditView显示的CharSequence
	 * 
	 * @param picPath 需要显示的图片路径
	 * @return
	 */
	private CharSequence getDrawableStr(String picPath) {
		InputStream is;
		try {
			String str = "<img src=\"" + picPath + "\"/>";
			is = new FileInputStream(picPath);
			BitmapFactory.Options opts = new BitmapFactory.Options();
			opts.inTempStorage = new byte[100 * 1024];
			opts.inPreferredConfig = Bitmap.Config.RGB_565; // 默认是Bitmap.Config.ARGB_8888
			opts.inSampleSize = 4;
			/* 下面两个字段需要组合使用 ,说是为了节约内存 */
			opts.inPurgeable = true;
			opts.inInputShareable = true;
			Bitmap bm = BitmapFactory.decodeStream(is, null, opts);

			final SpannableString ss = new SpannableString(str);
			// 定义插入图片
			Drawable drawable = new BitmapDrawable(bm);
			drawable.setBounds(2, 0, 400, 350);
			ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
			ss.setSpan(span, 0, ss.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
			ss.setSpan(new MyClickableSpan(), 0, ss.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
			return ss;
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}

	}
	
	public class MyClickableSpan extends ClickableSpan {
		 @Override 
	        public void onClick(View widget) { 

	            Toast.makeText(MainActivity.this, 
	                    "Image Clicked " + "ddddddddddddddd", 
	                    Toast.LENGTH_SHORT).show(); 

	        } 
	}



工程代码地址:http://download.csdn.net/detail/u010366911/7375925


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值