最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Android開(kāi)發(fā)支持表情的實(shí)現(xiàn)詳解

 更新時(shí)間:2013年05月10日 10:48:14   投稿:jingxian  
本篇文章是對(duì)在Android開(kāi)發(fā)中支持表情的實(shí)現(xiàn)代碼進(jìn)行了介紹。需要的朋友參考下

最近項(xiàng)目需要支持表情,表情的添加和解析實(shí)現(xiàn)基本上是參照Android自身的SmileyParser,具體就不多講了,直接貼上代碼:

復(fù)制代碼 代碼如下:

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的對(duì)應(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;
}

/**
* 建立匹配用的正則表達(dá)式
* @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;
}
}


實(shí)現(xiàn)過(guò)程中遇到個(gè)小問(wèn)題:往TextView中添加表情時(shí),當(dāng)文本既有表情也有文字時(shí),顯示是正常的,但是當(dāng)文本中只有表情時(shí),發(fā)現(xiàn)表情顯示會(huì)偏上,而且上面有一部分被截?cái)唷?br />
TextView布局如下:
復(fù)制代碼 代碼如下:

<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"

/>


解決方法:這里的問(wèn)題應(yīng)該是TextView在判斷行距的時(shí)候是根據(jù)字體來(lái)判斷的,但是當(dāng)文本是表情的時(shí)候這個(gè)判斷有些問(wèn)題,導(dǎo)致行距過(guò)小,所以顯示表情的時(shí)候就截?cái)嗔?,解決方法是設(shè)置一下TextView的最小高度,同時(shí)要指定文本向下對(duì)齊。另外在創(chuàng)建ImagePan的時(shí)候如果指定ImageSpan.ALIGN_BOTTOM對(duì)齊方式一般是不會(huì)出現(xiàn)這個(gè)問(wèn)題的,但是這種方式下表情顯示會(huì)偏下。

修改后TextView布局如下:
復(fù)制代碼 代碼如下:

<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)文章

最新評(píng)論

辉县市| 福泉市| 榆社县| 宾川县| 洛南县| 昭苏县| 灵台县| 盐津县| 油尖旺区| 镇安县| 中超| 雷波县| 邻水| 缙云县| 托克托县| 油尖旺区| 石嘴山市| 德令哈市| 保靖县| 大田县| 贡嘎县| 湾仔区| 万源市| 光泽县| 揭东县| 乌恰县| 铜陵市| 富顺县| 巩留县| 海淀区| 灯塔市| 会昌县| 潼南县| 芦溪县| 平原县| 大冶市| 墨玉县| 黔西县| 兴城市| 黔南| 恩平市|