android表情加文字图片,Android开发技巧之像QQ一样输入文字和表情图像
EditText和TextView一樣,也可以進(jìn)行圖文混排。所不同的是,TextView只用于顯示圖文混排效果,而EditText不僅可顯示,也可混合輸入文字和圖像,讓我們先回顧一下圖5.2所示的QQ聊天輸入框,在輸入框中可以同時輸入文字和表情圖像。實際上,這種效果在Android SDK中只需要幾行代碼就可以實現(xiàn)。為了使讀者更有學(xué)習(xí)的沖動,先來欣賞一下即將實現(xiàn)的效果,如圖5.16所示。
圖5.16 在EditText控件中輸入文字和圖像
為了實現(xiàn)這個程序,首先來準(zhǔn)備一些要用到的素材,也就是要在EditText控件中輸入的圖像文件。本例準(zhǔn)備了9個png圖像文件(face1.png至face9.png),都放在了res\drawable目錄中。
接下來在屏幕上放一個只能顯示3行(可輸入多行)的EditText和一個Button,布局文件的代碼如下:
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="wrap_content" android:lines="3" android:gravity="left|top"/>
android:layout_height="wrap_content" android:text="隨機(jī)插入表情"
android:onClick="onClick_RandomFace" android:layout_marginTop="10dp" />
上面代碼的標(biāo)簽中將android:gravity屬性值設(shè)為left|top。以使輸入的文本從左上角開始顯示,如果不設(shè)置該屬性,則輸入的文本會從左側(cè)中心位置開始顯示(由于設(shè)置了android:line=”3”,因此,EditText可同時顯示三行的內(nèi)容,所以會存在這個問題,如果只顯示一行,則不存在這個問題)。
標(biāo)簽的android:onClick屬性值指定了單擊事件方法(onClick_RandomFace),在該方法中隨機(jī)獲得了face1.png至face9.png中任意一個圖像資源的ID。最常用的方法是將這9個圖像資源ID放到數(shù)組中,然后隨機(jī)產(chǎn)生一個數(shù)組索引來獲取相應(yīng)的圖像資源ID。但本例未采用這種方法,而是采用了直接通過反射技術(shù)從R.drawable類中獲得圖像資源ID的方法。這種方法的好處是一但圖像資源非常多時,可以不需要在數(shù)組中挨個定義就可以獲得任意的圖像資源ID。
在5.2.2節(jié)使用了標(biāo)簽來插入圖像,雖然在EditText控件中插入圖像也可采用這種方法。但本例使用了另外一種更簡單的方法,就是使用android.text.style.ImageSpan類來直接插入圖像。下面來看看具體的實現(xiàn)代碼。
public void onClick_RandomFace(View view)
{
// 隨機(jī)產(chǎn)生1至9的整數(shù)
int randomId = 1 + new Random().nextInt(9);
try
{
// 根據(jù)隨機(jī)產(chǎn)生的1至9的整數(shù)從R.drawable類中獲得相應(yīng)資源ID(靜態(tài)變量)的Field對象
Field field = R.drawable.class.getDeclaredField("face" + randomId);
// 獲得資源ID的值,也就是靜態(tài)變量的值
int resourceId = Integer.parseInt(field.get(null).toString());
// 根據(jù)資源ID獲得資源圖像的Bitmap對象
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
// 根據(jù)Bitmap對象創(chuàng)建ImageSpan對象
ImageSpan imageSpan = new ImageSpan(this, bitmap);
// 創(chuàng)建一個SpannableString對象,以便插入用ImageSpan對象封裝的圖像
SpannableString spannableString = new SpannableString("face");
// 用ImageSpan對象替換face
spannableString.setSpan(imageSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 將隨機(jī)獲得的圖像追加到EditText控件的最后
edittext.append(spannableString);
}
catch (Exception e)
{
}
}
編寫上面代碼需要注意如下幾點:
1. 由于R.drawable中的資源ID都是public的靜態(tài)變量,因此,可直接使用Field.get方法獲得這些變量的值。如果是private或protected的變量,需要field.setAccessible(true)設(shè)置變量值的訪問權(quán)限才可以讀寫這些變量。
2. 使用Field.get方法獲得變量值時,如果是靜態(tài)變量。Field.get方法的參數(shù)值設(shè)為null即可。如果不是靜態(tài)變量,需要為Field.get方法指定一個變量所在類的對象作為參數(shù)值。
3. 由于EditText類不能直接插入Span對象,因此,需要先使用SpannableString對象來封裝Span對象(如本例中的ImageSpan對象),再將SpannableString對象插入到EditText控件中。
總結(jié)
以上是生活随笔為你收集整理的android表情加文字图片,Android开发技巧之像QQ一样输入文字和表情图像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络通信协议之粘包问题
- 下一篇: 抖音钟晓芹流泪猫猫头是什么梗