黑莓:聊天应用程序中的表情符号

标签 blackberry java-me chat emoticons

我想制作一个需要表情符号的聊天应用程序。我试图编写自己的 TextBox 来处理一些 unicode 字符并用微笑和表情符号替换它们,但这是一项艰巨的工作,我遇到了很多问题。

然后我尝试制作一个带有表情符号的自定义字体,但我发现字体是黑白的,不能着色。

然后我尝试使用不同的 EditFields,所以当我找到一个位图时,我绘制它并启动一个不同的 EditField 但这对几行不起作用并且发生了选择问题。

最好的方法是编写我自己的 textField,它将找到一个特殊的 unicode 字符,添加 2 个空格,获取 unicode 字符的位置,然后在该位置绘制位图图像。但是当表情符号的数量变大时,这很慢

有没有我错过的工具、API 或方法可以在 BlackBerry 设备上为我制作表情符号?请在这个主题上提供帮助 我到处搜索,但还没有找到

最佳答案

我们可以尝试使用网络论坛的方法:

  • 允许用户输入表情符号的 ASCII 码
  • 在消息编辑模式下将表情符号显示为文本代码
  • 在消息历史记录中将表情符号显示为图像(为此目的使用 BrowserField)
  • 使用额外的 html 格式

  • simulator screen shot with chat application

    试试这个代码:
    public final class ChatScreen extends MainScreen implements FieldChangeListener {
        static final int INT_MSG_MAX_LEN = 200;
        static final DateFormat FRMT_TIME = DateFormat
                .getInstance(DateFormat.TIME_SHORT);
        static final String STR_FRMT_IMG = "<img src=\"{0}\"></img>";
        static final String STR_FRMT_MSG = "<b>{0}</b> [{1}]: {2}</p>";
    
        // several emoticon ASCII codes
        static final String STR_CODE_SMILE = ":)";
        static final String STR_CODE_SADSMILE = ":(";
        static final String STR_CODE_WINK = ";)";
    
        // use emoticons from http://www.skypeemoticonslist.com
        static final String STR_IMG_URL = "http://www.skypeemoticonslist.com/images/";
        static final String STR_IMG_NAME_SMILE = "emoticon-0100-smile.png";
        static final String STR_IMG_NAME_SADSMILE = "emoticon-0101-sadsmile.png";
        static final String STR_IMG_NAME_WINK = "emoticon-0105-wink.png";
    
        static final Hashtable TABLE_URL = new Hashtable();
        static final Hashtable TABLE_IMG = new Hashtable();
    
        private static void initCode(String code, String imgFName) {
            String tag;
            // prepare table for online use
            // generate img tag with live url
            tag = MessageFormat.format(STR_FRMT_IMG, new Object[] { STR_IMG_URL
                    + imgFName });
            TABLE_URL.put(code, tag);
    
            // prepare table for offline use
            // retrieve image from project resources
            try {
                EncodedImage img = EncodedImage.getEncodedImageResource(imgFName);
                // generate img tag with embedded data url
                String dataStr = getDataUrl(img.getData(), img.getMIMEType());
                tag = MessageFormat.format(STR_FRMT_IMG, new Object[] { dataStr });
                TABLE_IMG.put(code, tag);
            } catch (IOException e) {
                System.out.println("\n Troubles preparing res for code " + code
                        + "  \n");
            }
        }
    
        static {
            initCode(STR_CODE_SMILE, STR_IMG_NAME_SMILE);
            initCode(STR_CODE_SADSMILE, STR_IMG_NAME_SADSMILE);
            initCode(STR_CODE_WINK, STR_IMG_NAME_WINK);
        }
    
        boolean mIsOffline = true;
        String mChatHistory = "";
    
        BrowserField mBrowserField = new BrowserField();
        EditField mTextField = new EditField("Input message: ", "",
                INT_MSG_MAX_LEN, Field.USE_ALL_WIDTH);
        ButtonField mBtnUserLeft = new ButtonField("Send as Mr. Left",
                Field.FIELD_LEFT | ButtonField.CONSUME_CLICK);
        ButtonField mBtnUserRight = new ButtonField("Send as Mr. Right",
                Field.FIELD_RIGHT | ButtonField.CONSUME_CLICK);
    
        public ChatScreen() {
            super(Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR);
            add(mTextField);
            HorizontalFieldManager hfm = new HorizontalFieldManager(
                    Field.USE_ALL_WIDTH | Field.FIELD_HCENTER);
            mBtnUserLeft.setChangeListener(this);
            mBtnUserRight.setChangeListener(this);
            hfm.add(mBtnUserLeft);
            hfm.add(mBtnUserRight);
            add(hfm);
            VerticalFieldManager vfm = new VerticalFieldManager(Field.USE_ALL_WIDTH
                    | Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR);
            vfm.add(mBrowserField);
            add(vfm);
        }
    
        protected void makeMenu(Menu menu, int instance) {
            menu.add(new MenuItem(mIsOffline ? "Go Online" : "Go Offline", 0, 0) {
                public void run() {
                    mIsOffline = !mIsOffline;
                }
            });
            super.makeMenu(menu, instance);
        }
    
        public void fieldChanged(final Field field, int context) {
            if (field == mBtnUserLeft) {
                addMessage("Mr. Left");
            } else if (field == mBtnUserRight) {
                addMessage("Mr. Right");
            }
        }
    
        private void addMessage(String userName) {
            String message = mTextField.getText();
    
            // update message with emoticons
            message = replaceCodeWithImg(message, STR_CODE_SMILE);
            message = replaceCodeWithImg(message, STR_CODE_SADSMILE);
            message = replaceCodeWithImg(message, STR_CODE_WINK);
            String timeStr = FRMT_TIME.format(new Date(System.currentTimeMillis()));
            String text = MessageFormat.format(STR_FRMT_MSG, new Object[] {
                    userName, timeStr, message });
            mChatHistory = text + mChatHistory;
            mTextField.setText("");
            // fix IllegalStateException up to
            // http://supportforums.blackberry.com/t5/Java-Development/IllegalStateException-at-displayContent-on-browserfield/td-p/1071991
            mBrowserField.setFocus();
    
            mBrowserField.displayContent("<html>" + mChatHistory + "</html>", "");
        }
    
        private String replaceCodeWithImg(String message, String code) {
            Hashtable table = mIsOffline ? TABLE_IMG : TABLE_URL;
            int index = message.indexOf(code);
            while (index != -1) {
                String begin = message.substring(0, index);
                String end = message.substring(index + code.length());
                String tag = (String) table.get(code);
                message = begin + tag + end;
    
                index = message.indexOf(code, index + tag.length());
            }
            return message;
        }
    
        // src taken from http://bfo.com/blog/files/src/DataStreamHandler.java
        private static final String getDataUrl(byte[] data, String mimetype)
                throws IOException {
            final StringBuffer sb = new StringBuffer();
            sb.append("data:");
            sb.append(mimetype);
            sb.append(";base64,");
            OutputStream out = new OutputStream() {
                public void write(int c) {
                    sb.append((char) (c & 0xFF));
                }
            };
            Base64OutputStream fout = new Base64OutputStream(out);
            fout.write(data);
            fout.close();
            return sb.toString();
        }
    }
    

    关于黑莓:聊天应用程序中的表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7268276/

    相关文章:

    python - 在 Python 中创建一个简单的聊天应用程序(套接字)

    blackberry - BlackBerry SDK的 9-patch 库

    blackberry - 处理字段的方向变化

    java - 如何借助j2me项目res文件夹中的证书发送http请求?

    java - 如何阻止用户在J2ME应用程序的字段之外输入数据?

    html - 如何从网页解析 Gmail 聊天记录?

    java - 如何在 J2ME 中实现 session 变量?

    java - 如何让 labelSwitch 在打开和关闭时执行某些操作?

    java-me - 如何将组件放置在另一个组件的前面?

    android - 从 XMPP android 获取不同的发件人和接收地址,任何解决方案?