基于Android開發(fā)支持表情的實現(xiàn)詳解
最近項目需要支持表情,表情的添加和解析實現(xiàn)基本上是參照Android自身的SmileyParser,具體就不多講了,直接貼上代碼:
public class SmileyParser {
private static SmileyParser sInstance = null;
private Context mContext = null;
private Pattern mPattern = null;
private HashMap<String, Integer> mSmileyTextToId = null;
private final String[] mSmileyArrays =
private int[] mSmileyIds = null;
private String[] mSmileyTexts = null;
public static SmileyParser getInstance() {
if (sInstance == null) {
sInstance = new SmileyParser(GameDataMgr.getInstance().getActivity());
}
return sInstance;
}
private SmileyParser(Context context) {
// TODO Auto-generated constructor stub
mContext = context;
initSmileyIds();
mPattern = buildPattern();
mSmileyTextToId = buildSmileyRes();
}
private void initSmileyIds(){
mSmileyIds = new int[mSmileyArrays.length / 2];
mSmileyTexts = new String[mSmileyArrays.length /2];
for (int i = 0; i < mSmileyArrays.length / 2; i++) {
mSmileyTexts[i] = mSmileyArrays[i*2];
mSmileyIds[i] = Integer.parseInt(mSmileyArrays[i*2 + 1]);
}
}
public int[] getSmileyIDs(){
return mSmileyIds;
}
public int getSmileyResourceId(int smileyId){
String idString = "face_" + Integer.toString(smileyId);
int id = getResId(idString, mContext, R.drawable.class);
return id;
}
public static int getResId(String variableName, Context context, Class<?> c) {
try {
Field idField = c.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
public String[] getSmileyTexts(){
return mSmileyTexts;
}
Drawable getSmileyDrawable(int id){
Drawable drawable = null;
drawable = mContext.getResources().getDrawable(getSmileyResourceId(id));
return drawable;
}
/**
* 建立String - Id的對應(yīng)關(guān)系
*/
private HashMap<String, Integer> buildSmileyRes(){
HashMap<String, Integer> smileyTextToId = new HashMap<String, Integer>(mSmileyIds.length);
for(int i = 0;i < mSmileyIds.length;++i){
smileyTextToId.put(mSmileyTexts[i], mSmileyIds[i]);
}
return smileyTextToId;
}
/**
* 建立匹配用的正則表達式
* @return
*/
private Pattern buildPattern(){
StringBuilder builder = new StringBuilder(mSmileyTexts.length * 3);
builder.append('(');
for (String s: mSmileyTexts) {
builder.append(Pattern.quote(s));
builder.append('|');
}
builder.replace(builder.length() - 1, builder.length(), ")");
return Pattern.compile(builder.toString());
}
/**
* 把文字轉(zhuǎn)換為圖片
* @param text
* @return
*/
public Spannable addSmileySpans(CharSequence text){
SpannableStringBuilder spBuilder = new SpannableStringBuilder(text);
Matcher matcher = mPattern.matcher(text);
while (matcher.find()) {
int id = mSmileyTextToId.get(matcher.group());
matcher.start(),matcher.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spBuilder.setSpan(new ImageSpan(mContext,getSmileyResourceId(id),ImageSpan.ALIGN_BASELINE), matcher.start(),matcher.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return spBuilder;
}
}
實現(xiàn)過程中遇到個小問題:往TextView中添加表情時,當(dāng)文本既有表情也有文字時,顯示是正常的,但是當(dāng)文本中只有表情時,發(fā)現(xiàn)表情顯示會偏上,而且上面有一部分被截斷。
TextView布局如下:
<TextView
android:id="@+id/comment_item_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:textSize="16sp"
android:textColor="#333333"
/>
解決方法:這里的問題應(yīng)該是TextView在判斷行距的時候是根據(jù)字體來判斷的,但是當(dāng)文本是表情的時候這個判斷有些問題,導(dǎo)致行距過小,所以顯示表情的時候就截斷了,解決方法是設(shè)置一下TextView的最小高度,同時要指定文本向下對齊。另外在創(chuàng)建ImagePan的時候如果指定ImageSpan.ALIGN_BOTTOM對齊方式一般是不會出現(xiàn)這個問題的,但是這種方式下表情顯示會偏下。
修改后TextView布局如下:
<TextView
android:id="@+id/comment_item_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:textSize="16sp"
android:textColor="#333333"
android:minHeight="25dp"
android:gravity="bottom"
/>
相關(guān)文章
Android實現(xiàn)快速滾動FastScrollView效果
這篇文章主要介紹了Android實現(xiàn)快速滾動FastScrollView效果,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
Android實現(xiàn)美團、大眾點評的購買懸浮效果(ScrollView滾動監(jiān)聽)
這篇文章主要為大家詳細(xì)介紹了Android對ScrollView滾動監(jiān)聽,實現(xiàn)美團、大眾點評的購買懸浮效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android使用Activity實現(xiàn)從底部彈出菜單或窗口的方法
這篇文章主要介紹了Android使用Activity實現(xiàn)從底部彈出菜單或窗口的方法,涉及Android布局、窗口、事件監(jiān)聽、權(quán)限控制等相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
基于Android實現(xiàn)轉(zhuǎn)盤按鈕代碼
這篇文章主要介紹了基于Android實現(xiàn)轉(zhuǎn)盤按鈕代碼的相關(guān)資料,需要的朋友可以參考下2015-12-12
在Android中使用SQLite數(shù)據(jù)庫及其操作詳解
在?Android?開發(fā)中,使用?SQLite?數(shù)據(jù)庫是一種常見的持久化數(shù)據(jù)存儲方式,本文將通過代碼示例詳細(xì)講解如何在?Android?中創(chuàng)建數(shù)據(jù)庫表、插入數(shù)據(jù)、執(zhí)行查詢操作以及驗證查詢結(jié)果,需要的朋友可以參考下2024-08-08
ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面
這篇文章主要為大家詳細(xì)介紹了ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11

