广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    基于Android开发支持表情的实现详解

    2018-04-07 07:49:07 次阅读 稿源:互联网
    广告

    最近项目需要支持表情,表情的添加和解析实现基本上是参照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 =
    {"/西瓜","89","/便便","59","/太","74","/偷笑","20","/傲慢","23","/再","39","/凋","64","/呆","3","/怒","11","/","54","/可","21","/","46","/咖啡","60","/哈欠","104","/鄙","105","/委屈","106","/快哭了","107","/","108","/","109","/","110","/可","111","/菜刀","112","/啤酒","113","/球","114","/乒乓","115","/示","116","/瓢","117","/抱拳","118","/勾引","119","/拳","120","/差","121","/你","122","/NO","123","/OK","124","/圈","125","/磕","126","/回","127","/跳","128","/手","129","/激","130","/街舞","131","/吻","132","/左太","133","/右太","134","/吐","19","/蛋糕","53","/呲牙","13","/咒","31","/足球","57","/嘘","33","/困","25","/大兵","29","/大哭","9","/强","76","/","30","/抱","49","/害羞","6","/尬","10","/右哼哼","103","/火","86","/利","79","/得意","4","/","14","/心碎","67","/恐","26","/微笑","0","/憨笑","28","/抓狂","18","/折磨","35","/抖","41","/握手","78","/吻","85","/鼓掌","99","/撇嘴","1","/敲打","38","/","34","/月亮","75","/流汗","27","/流","5","/糗大了","100","/心","66","/左哼哼","102","/玫瑰","63","/疑","32","/白眼","22","/睡","8","/冷汗","96","/示","65","/弱","77","/跳跳","43","/色","2","/炸","55","/笑","101","/衰","36","/刀","56","/皮","12","/鼻","98","/酷","16","/物","69","/嘴","7","/","15","/","24","/","61","/骷","37","/情","42"};
    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的对应关系
    */
    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());
    }

    /**
    * 把文字转换为图片
    * @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;
    }
    }

    实现过程中遇到个小问题:往TextView中添加表情时,当文本既有表情也有文字时,显示是正常的,但是当文本中只有表情时,发现表情显示会偏上,而且上面有一部分被截断。

    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"

    />

    解决方法:这里的问题应该是TextView在判断行距的时候是根据字体来判断的,但是当文本是表情的时候这个判断有些问题,导致行距过小,所以显示表情的时候就截断了,解决方法是设置一下TextView的最小高度,同时要指定文本向下对齐。另外在创建ImagePan的时候如果指定ImageSpan.ALIGN_BOTTOM对齐方式一般是不会出现这个问题的,但是这种方式下表情显示会偏下。

    修改后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"

    />

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告