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的点击事件,进行相关的操作…
欢迎大家拍砖….