是否可以在Android消息中添加动画表情符号

时间:2014-07-09 05:10:41

标签: android keyboard animated emoji android-input-method

我正在为Android开发一个表情符号键盘,但不知道如何在currentInputConnection的{​​{1}}中添加动画表情符号。

InputMethodService

此处内容是 Edittext content= findVie...... sb = new SpannableStringBuilder(); String dummyText = "-"; sb.append(dummyText); try { sb.setSpan(anim = new AnimatedImageSpan(new AnimatedGifDrawable( getAssets().open("54.gif"), new AnimatedGifDrawable.UpdateListener() { @Override public void update() { content.requestLayout(); content.invalidate(); } })), sb.length() - dummyText.length(), sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } content.setText(sb); 视图,但我没有任何编辑文本视图。我只有editText返回currentInputConnection

2 个答案:

答案 0 :(得分:3)

如果我理解正确,你试图将一个“动画图像”(像gif一样)发送给EditText吗?据我所知,这可能是不可能的。如果您已阅读InputConnection的{​​{3}},则应该知道它没有提供任何API来执行此操作。

实际上我正在开发一个Android IME项目,我们在其中实现静态表情符号输入键盘。我们所做的只是简单地通过InputConnection发送表情符号的编码字节,然后微笑的面孔出现在编辑框中。

如果您使用过documentation,您可能会注意到其客户端已实现自定义表情符号键盘(包括静态和动态内容)。那是因为他们确切知道他们在做什么。

答案 1 :(得分:0)

我也在尝试做同样的事情。然后我得到了答案。

如果您想在自己的应用中实施并向自己的应用发送消息

然后,您可以将每个图像模式映射到某个值。

////////

public class ViewsUtils {

    private static final Map<Pattern, Integer> emoticons = new HashMap<Pattern, Integer>();


    static {
        addPattern(emoticons, "\ud83d\udeb6", R.drawable.emot_d83ddeb6);
        ...
    }

    private static void addPattern(Map<Pattern, Integer> map, String smile,
            int resource) {
        map.put(Pattern.compile(Pattern.quote(smile)), resource);
    }

    public static boolean addSmiles(Context context, Spannable spannable) {
        boolean hasChanges = false;
        for (Entry<Pattern, Integer> entry : emoticons.entrySet()) {
            Matcher matcher = entry.getKey().matcher(spannable);
            while (matcher.find()) {
                boolean set = true;
                for (ImageSpan span : spannable.getSpans(matcher.start(),
                        matcher.end(), ImageSpan.class))
                    if (spannable.getSpanStart(span) >= matcher.start()
                            && spannable.getSpanEnd(span) <= matcher.end())
                        spannable.removeSpan(span);
                    else {
                        set = false;
                        break;
                    }
                if (set) {
                    hasChanges = true;
                    spannable.setSpan(new ImageSpan(context, entry.getValue()),
                            matcher.start(), matcher.end(),
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        }
        return hasChanges;
    }

    public static void setText(TextView view, String text) {
        if (null != view && null != text) {
            Spanned spanned = Html.fromHtml(text);
            SpannableString spannableString = SpannableString.valueOf(spanned);
            addSmiles(view.getContext(), spannableString);
            view.setText(spannableString);
        }
    }

    public static void setText(View parent, int viewId, int resId) {
        if (null != parent) {
            String text = parent.getContext().getString(resId);
            setText(parent, viewId, text);
        }
    }

    public static void setText(View parent, int viewId, String text) {
        if (null != parent) {
            TextView view = (TextView) parent.findViewById(viewId);
            if (null != view && null != text) {
                Spanned spanned = Html.fromHtml(text);
                SpannableString spannableString = SpannableString.valueOf(spanned);
                addSmiles(view.getContext(), spannableString);
                view.setText(spannableString);
            }
        }
    }

    public static void setText(View parent, int viewId, String text,
            int visibility) {
        if (null != parent) {
            TextView view = (TextView) parent.findViewById(viewId);
            if (null != view && null != text) {
                Spanned spanned = Html.fromHtml(text);
                SpannableString spannableString = SpannableString.valueOf(spanned);
                addSmiles(view.getContext(), spannableString);
                view.setText(spannableString);
                view.setVisibility(visibility);
            }
        }
    }

}

您只需要为要在静态块中处理的表情图标添加地图条目。之后使用这个类非常简单 - 只需调用一些setText(或直接调用addSmiles)方法。它也会处理Html解析。