EditText显示图片,删除图片,点击图片
来源:互联网 发布:sybase查看数据库空间 编辑:程序博客网 时间:2024/05/16 01:52
此处将介绍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_8888opts.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);//设置 imgif(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_8888opts.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
0 0
- EditText显示图片,删除图片,点击图片
- android edittext点击图片显示隐藏密码
- 复合组件(EditText输入内容,显示图片,点击图片删除输入内容,点击button弹出输入的内容)
- EditText显示图片
- EditText显示图片
- EditText中显示图片
- 图片预览,图片显示以及图片删除
- 图片点击触发显示
- 点击文字显示图片
- js点击显示图片
- EditText添加图片和显示图片
- EditText加入图片混编显示
- EditText加入图片混编显示
- EditText加入图片混编显示
- 点击图片,弹出层显示图片
- 图片上传点击通过js显示图片
- Android--EditText/TextView 中添加图片,以及点击图片.
- html点击文字显示图片
- 百度分享 一个页面多个分享
- 赵雅智:android使用adb命令详解附图
- oracle order by 索引是否使用的情况
- 如何学好Java语言?
- 2E02-View-Lists-multiple -choice-list
- EditText显示图片,删除图片,点击图片
- 60行代码:Javascript 写的俄罗斯方块游戏
- hadoop 运行时 ClassNotFoundException
- Hypertable工具之ht_rsclient
- Spket 破解方法很好的javascript脚本编译器
- 黑马程序员-函数的嵌套调用与递归调用
- AddToBackStack
- JAVA的Date类与Calendar类【转】
- VC 打开批处理文件 可以看到dos窗口,但是执行后没有效果