EditText图文混排
下面就具體說一下我遇到的問題,首先是EditText里面的圖文混排問題,這個問題的難點就是三點:
1.怎么插圖片?
2.怎么保存插入的圖片和文字?
3.怎么解析回圖片和文字
?
解決:
一.怎么插入圖片
?
在這里定義了兩個Button按鈕和一個EditText,插入圖片的話,就是點擊插入圖片按鈕然后從sd卡中選擇一張圖片出來。下面是實現代碼:
?
首先是button的監聽事件:
btn_insertImage.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent getImage = new Intent(Intent.ACTION_GET_CONTENT);getImage.addCategory(Intent.CATEGORY_OPENABLE);getImage.setType("image/*");startActivityForResult(getImage, 1);}});來分析一下代碼:
1.ACTION_GET_CONTENT是標準的Activity Action的一種,那什么是Activity Action呢,簡單來說就是讓用戶選擇一種特殊的數據并得到它。
2.通過以上分析,可以知道我們定義了這樣一個intent,要取得數據,取得數據要能夠被打開,且類型為image,這樣我們就可以執行了。
3.addCategory是要增加一個分類,增加一個什么分類呢?就是增加CATEGORY_OPENABLE,從字面意思值是增加一個可以打開的分類,也即是取得的uri要可以被ContentResolver解析,注意這里的分類即是執行的附加條件。
4.通過以上分析,可以知道我們定義了這樣一個intent,要取得數據,取得數據要能夠被打開,且類型為image,這樣我們就可以執行了。
代碼分析:
1.首先使用intent.getData得到uri
2.然后調用BitmapFactory的解碼函數decodeStream且要求的參數為流(Stream),所以要用ContentResolver解析uri為流。
3.接著通過一個resizeImage函數重新調整bitmap大小,這里不再給出
4.然后就是要把所得到的圖片放到EditText里了
?
private SpannableString getBitmapMime(Bitmap pic, Uri uri) {String path = uri.getPath();SpannableString ss = new SpannableString(path);ImageSpan span = new ImageSpan(this, pic);ss.setSpan(span, 0, path.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);return ss;}?
private void insertIntoEditText(SpannableString ss) {Editable et = editText.getText();// 先獲取Edittext中的內容int start = editText.getSelectionStart();et.insert(start, ss);// 設置ss要添加的位置editText.setText(et);// 把et添加到Edittext中editText.setSelection(start + ss.length());// 設置Edittext中光標在最后面顯示 }代碼分析:
1.在getBitmapMime()中,首先建立一個SpannableString,r然后我們要給它附一張圖片,這張圖片來自我們的sd卡,然后是 setSpan()函數,這里有4個參數,分別是要插入的對象,起始位置,終止位置,標記,在本程序里插入的對象為一張圖片,起始位置為0,終止位置為 path的長度,標記為會刪除緩沖區里原有的text,這里即為path。
2.在insertIntoEditText()中,因為是動態添加,所以要用到Editable,然后先把ss添加到et里,然后在放到editText里,最后在設置一下光標的位置為最后
至此,插入圖片完成
二.?怎么保存圖片?
保存按鈕的監聽事件代碼:
Button btn_save = (Button) findViewById(R.id.save);btn_save.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString content = editText.getText().toString();Bundle data = new Bundle();data.putString("nei", content);Intent intent = new Intent(MainActivity.this, Display.class);intent.putExtra("neirong", data);startActivity(intent);}});代碼分析:
代碼非常簡單,我們只需保存editText里面的內容轉化成String存到content中,(注意:這里的圖片會變為它的路徑即為/mnt/sdcard/.........這樣的形式),
然后我們啟動另外一個Activity,這里當然也可以保存content到數據庫中。
至此,保存圖片完成
3.?怎么解析回圖片和文字
首先,我們有另外一個Activity,名字為display,注這里不在給圖,因為view里只有一個EditText
EditText display;@Override protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stub super.onCreate(savedInstanceState);setContentView(R.layout.display);display = (EditText) findViewById(R.id.display);String imagePath = getIntent().getBundleExtra("neirong").getString("nei");SpannableString ss = new SpannableString(imagePath);Pattern p=Pattern.compile("/mnt/sdcard/.+?\\.\\w{3}");Matcher m=p.matcher(imagePath);while(m.find()){Bitmap bm = BitmapFactory.decodeFile(m.group());Bitmap rbm = resizeImage(bm, 100, 100);ImageSpan span = new ImageSpan(this, rbm);ss.setSpan(span, m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}display.setText(ss); }代碼分析:
首先取出上一個Activity里面的內容,保存到imagePath中,接下來就是把imagePath中的圖片改為圖片即可,同樣使用SpannableString,但怎么在一個很長的String中找到圖片的路徑呢,要使用正則表達式,這里是我寫的一個正則表達式/mnt/sdcard/.+?\\.\\w{3},寫的比較差,呵呵,通過正則表達式找到路徑,就可以在BitmapFactory中找到圖片,然后就可以利用setSpan()函數進行替換,最后在顯示出來。
至此,解析回圖片和文字完成
另外一種實現圖文混編的方式:是通過html的<img>標簽的方式插入到edittext中去:
標 記中有一個<img>標記。通過這個標記,可以很容易地實現將圖像插入到EditText的功能。不過使用<img>標簽要比使 用其他的標簽多一個步驟,這就是要實現一個ImageGetter接口,通過這個接口,可以獲得一個Drawable對象。先看看如下的代碼:
?
@Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); Drawable d = getResources().getDrawable(id); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); return d; }?
上面的代碼通過ImageGetter接口的getDrawable方法返回了一個Drawable對象,其中source參數的值就是<img>標簽的src屬性的值。我們需要通過如下的代碼來使用<img>標簽。
?
editText.append(Html.fromHtml("<imgsrc='"+ faces[new Random().nextInt(6)] +"'/>", imageGetter, null));?
其 中faces是一個int類型數組,保存了相應的drawable資源的ID值。在使用<img>標簽之前需要使用 Html.fromHtml方法來封裝這些標簽,如果使用的是<img>標簽,需要使用fromHtml方法的第2個參數指定 ImageGetter對象,以便通過<img>標簽的src屬性獲得相應的Drawable對象。通過EditText.append方法 插入<img>標簽后,系統會自動將<img>標簽轉換成相應的圖像顯示在EditText中.
?
?
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的EditText图文混排的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: intellij idea怎么设置jav
- 下一篇: arcgis的炸开多边形功能