有可能在android短信中添加动画表情符号吗?



我正在为android开发一个表情符号键盘,但不知道如何在InputMethodServicecurrentInputConnection中添加动画表情符号。

 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视图,但我没有任何编辑文本视图。我只有InputMethodService.getCurrentInputConnection()返回的currentInputConnection

如果我理解正确,你正试图发送一个"动画图像"(像一个gif)到EditText对吗?据我所知,这可能是不可能的。如果您已经阅读了InputConnection的文档,您应该知道它没有提供任何API来执行此操作。

实际上我正在做一个Android IME项目,我们实现了一个静态的Emoji输入键盘。我们所要做的只是通过InputConnection发送表情符号的编码字节,然后笑脸就会出现在编辑框中。

如果你使用过微信,你可能会注意到它的客户端已经实现了一个自定义的表情键盘(包括静态和动态内容)。那是因为他们很清楚自己在做什么。

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

如果你想在你的应用程序中实现并发送消息到你自己的应用程序

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

////////

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

    static {
        addPattern(emoticons, "ud83dudeb6", 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);
            }
        }
    }
}

你只需要为你想在静态块中处理的emote图标添加地图条目。之后使用这个类非常容易—只需调用一些setText(或直接调用addSmiles)方法。它也可以处理Html解析

相关内容

  • 没有找到相关文章

最新更新