Android 在文字中插入表情圖片

來源:互聯網
上載者:User

EditText和TextView一樣,也可以進行圖文混排。所不同的是,TextView只用於顯示圖文混排效果,而EditText不僅可顯示, 也可混合輸入文字和映像,讓我們先回顧一5.2所示的QQ聊天輸入框,在輸入框中可以同時輸入文字和表情映像。實際上,這種效果在Android SDK中只需要幾行代碼就可以實現。為了使讀者更有學習的衝動,先來欣賞一下即將實現的效果,如所示。

在EditText控制項中輸入文字和映像

     為了實現這個程式,首先來準備一些要用到的素材,也就是要在EditText控制項中輸入的影像檔。本例準備了9個png影像檔(face1.png至face9.png),都放在了res\drawable目錄中。
接下來在螢幕上放一個只能顯示3行(可輸入多行)的EditText和一個Button,布局檔案的代碼如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="fill_parent"    android:layout_height="fill_parent">    <EditText android:id="@+id/edittext" android:layout_width="fill_parent"        android:layout_height="wrap_content" android:lines="3" android:gravity="left|top"/>    <Button android:layout_width="wrap_content"        android:layout_height="wrap_content" android:text="隨機插入表情"        android:onClick="onClick_RandomFace" android:layout_marginTop="10dp" /></LinearLayout>

上面代碼的<EditText>標籤中將android:gravity屬性值設為left|top。以使輸入的文本從左上方開始顯 示,如果不設定該屬性,則輸入的文本會從左側中心位置開始顯示(由於設定了android:line=”3”,因此,EditText可同時顯示三行的內 容,所以會存在這個問題,如果只顯示一行,則不存在這個問題)。

     <Button>標籤的android:onClick屬性值指定了單擊事件方法(onClick_RandomFace),在該方法 中隨機獲得了face1.png至face9.png中任意一個映像資源的ID。最常用的方法是將這9個映像資源ID放到數組中,然後隨機產生一個數組索 引來擷取相應的映像資源ID。但本例未採用這種方法,而是採用了直接通過反射技術從R.drawable類中獲得映像資源ID的方法。這種方法的好處是一 但映像資源非常多時,可以不需要在數組中挨個定義就可以獲得任意的映像資源ID。

     在5.2.2節使用了<img>標籤來插入映像,雖然在EditText控制項中插入映像也可採用這種方法。但本例使用了另外一種更簡單 的方法,就是使用android.text.style.ImageSpan類來直接插入映像。下面來看看具體的實現代碼。

public void onClick_RandomFace(View view){            //  隨機產生1至9的整數    int randomId = 1 + new Random().nextInt(9);    try    {        //  根據隨機產生的1至9的整數從R.drawable類中獲得相應資源ID(靜態變數)的Field對象        Field field = R.drawable.class.getDeclaredField("face" + randomId);        //  獲得資源ID的值,也就是靜態變數的值        int resourceId = Integer.parseInt(field.get(null).toString());        //  根據資源ID獲得資源映像的Bitmap對象        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);        //  根據Bitmap對象建立ImageSpan對象        ImageSpan imageSpan = new ImageSpan(this, bitmap);        //  建立一個SpannableString對象,以便插入用ImageSpan對象封裝的映像        SpannableString spannableString = new SpannableString("face");        //  用ImageSpan對象替換face        spannableString.setSpan(imageSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        //  將隨機獲得的映像追加到EditText控制項的最後        edittext.append(spannableString);    }    catch (Exception e)    {    }}

編寫上面代碼需要注意如下幾點。
1.  由於R.drawable中的資源ID都是public的靜態變數,因此,可直接使用Field.get方法獲得這些變數的值。如果是 private或protected的變數,需要field.setAccessible(true)設定變數值的存取權限才可以讀寫這些變數。
2.  使用Field.get方法獲得變數值時,如果是靜態變數。Field.get方法的參數值設為null即可。如果不是靜態變數,需要為Field.get方法指定一個變數所在類的對象作為參數值。
3.  由於EditText類不能直接插入Span對象,因此,需要先使用SpannableString對象來封裝Span對象(如本例中的ImageSpan對象),再將SpannableString對象插入到EditText控制項中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.