我正在为android开发一个表情符号键盘,但不知道如何在InputMethodService
的currentInputConnection
中添加动画表情符号。
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解析