Android 图文混排

来源:互联网 发布:北京 软件编程培训班 编辑:程序博客网 时间:2024/05/16 06:45

先上代码:

public class ITBox extends RelativeLayout{private String TAG="ITBox";//调用系统相册-选择图片public static final int IMAGE = 1;private Context mContext;private EditText etInput;private AppendImageTask task;private String mResultOutPut="";private List<String>mResultImages=new ArrayList<>();public ITBox(Context context) {    this(context,null);}public ITBox(Context context, AttributeSet attrs) {    this(context, attrs,0);}public ITBox(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    mContext=context;    View view= LayoutInflater.from(context).inflate(R.layout.input_box,this);    etInput=view.findViewById(R.id.et_input);}public String getResultString(){    return getImages(etInput.getText().toString());}public  void printText(){    Log.i(TAG,"content------>"+etInput.getText().toString());}public List<String>getResultImages(){    mResultImages.clear();    String pattern="(/.*?\\.jpg)";    Pattern r = Pattern.compile(pattern);    Matcher matcher= r.matcher(etInput.getText().toString());    while( matcher.find() )    {    //            line=  line.replace(matcher.group(),"[image".concat(String.valueOf(count)).concat("]"));       // System.out.println( "匹配项" + count+":" + matcher.group() ); //group方法返回由以前匹配操作所匹配的输入子序列。        mResultImages.add(matcher.group());    }    return mResultImages;}@Overridepublic void setOnLongClickListener(OnLongClickListener l) {    etInput.setOnLongClickListener(l);}public void addImage(String localPath){    task=   new AppendImageTask();    task.execute(localPath);} class AppendImageTask extends AsyncTask<String,Integer,SpannableString> {    @Override    protected SpannableString doInBackground(String... params) {        try {            // 用imgUrl获取Bitmap对象            SpannableString spb=appendImage(params[0]);            mResultImages.add(params[0]);            return spb;        }catch (ExecutionException e){            e.printStackTrace();        } catch (InterruptedException e) {            e.printStackTrace();        }        return null;    }    @Override    protected void onPostExecute(SpannableString sp) {        super.onPostExecute(sp);        Editable edit = etInput.getEditableText();        // 获取光标位置        int index = etInput.getSelectionStart();        // 光标所在位置插入文字        edit.insert(index, sp);        Log.i("图文混排",etInput.getText().toString());    }    private   SpannableString appendImage(String imgUrl) throws ExecutionException, InterruptedException {            // 用imgUrl获取Bitmap对象            Bitmap bitmap = Glide.with(mContext.getApplicationContext())                    .load(imgUrl)                    .asBitmap() //必须                    .centerCrop()                    .into(500, 500)                    .get();            // 将Bitmap对象转换成Drawable对象            Resources res =mContext.getResources();            Drawable drawable = new BitmapDrawable(res, bitmap);            // 用imgUrl初始化SpannableString对象            SpannableString   msp = new SpannableString(imgUrl);            // 设置图片宽高            drawable.setBounds(0, 0, 600, 800);            msp.setSpan(new ImageSpan(drawable), 0, imgUrl.length(),                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);            // 获取Editable的对象            return  msp;        }}private String getImages(String line){    String pattern="(/.*?\\.jpg)";    Pattern r = Pattern.compile(pattern);    Matcher mactcher= r.matcher(line);    int count=0;    while( mactcher.find() )    {        line=  line.replace(mactcher.group(),"[image".concat(String.valueOf(count)).concat("]"));        count++;    }    return  line;}    }

appendImage 函数会把图片转化成 SpannableString对象,这样Editable可以插入对象了
注意:
1.输入框中获取的内容是包含地址用了[image0][image1]…..的内容替换了图片,同时混排的图片地址在mResultImages中,整个输入框的内容是mResultOutPut
2.替换的图片用的正则匹配的是 String pattern=”(/.*?\.jpg)”,匹配的内容是”/……. .jpg” 在实际使用是需要修改的 。

原创粉丝点击