Blackberry 黑莓:聊天应用中的表情符号
我想做一个聊天应用程序的表情是必要的。我试图编写自己的文本框来处理一些unicode字符,并用微笑和表情符号替换它们,但这是一项艰巨的工作,我遇到了许多问题 然后我试着做一个自定义字体,里面有表情符号,但我发现字体是黑白的,不能着色 然后我尝试使用不同的编辑字段,因此当我找到位图时,我会绘制它并启动不同的编辑字段,但这对几行都不起作用,并且出现了选择问题 最好的方法是编写自己的文本字段,找到一个特殊的unicode字符,在其中添加2个空格,获取unicode字符的位置,然后在此位置绘制位图图像。但当表情符号的数量变大时,这是非常缓慢的Blackberry 黑莓:聊天应用中的表情符号,blackberry,java-me,chat,emoticons,Blackberry,Java Me,Chat,Emoticons,我想做一个聊天应用程序的表情是必要的。我试图编写自己的文本框来处理一些unicode字符,并用微笑和表情符号替换它们,但这是一项艰巨的工作,我遇到了许多问题 然后我试着做一个自定义字体,里面有表情符号,但我发现字体是黑白的,不能着色 然后我尝试使用不同的编辑字段,因此当我找到位图时,我会绘制它并启动不同的编辑字段,但这对几行都不起作用,并且出现了选择问题 最好的方法是编写自己的文本字段,找到一个特殊的unicode字符,在其中添加2个空格,获取unicode字符的位置,然后在此位置绘制位图图像。
有没有我错过的工具、API或方法可以在BlackBerry设备上为我制作表情符号?请在本主题中提供帮助,我到处搜索,但未找到任何内容我们可以尝试使用web论坛方法:
- 允许用户为表情符号输入ASCII码
- 在消息编辑模式下,将表情符号显示为文本代码
- 在消息历史记录中将表情符号显示为图像(用于此目的)
- 使用其他html格式
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();
}
}
公共最终类ChatScreen扩展MainScreen实现FieldChangeListener{
静态最终整数整数最大长度=200;
静态最终日期格式FRMT\U TIME=日期格式
.getInstance(DateFormat.TIME\u SHORT);
静态最终字符串STR_FRMT_IMG=“”;
静态最终字符串STR_FRMT_MSG=“{0}[{1}]:{2}”;
//几种表情ASCII码
静态最终字符串STR_CODE_SMILE=“:)”;
静态最终字符串STR_CODE_SADSMILE=“:(”;
静态最终字符串STR_CODE_WINK=“;)”;
//使用来自http://www.skypeemoticonslist.com
静态最终字符串STR\u IMG\u URL=”http://www.skypeemoticonslist.com/images/";
静态最终字符串STR\u IMG\u NAME\u SMILE=“emoticon-0100-SMILE.png”;
静态最终字符串STR_IMG_NAME_SADSMILE=“emoticon-0101-SADSMILE.png”;
静态最终字符串STR_IMG_NAME_WINK=“emoticon-0105-WINK.png”;
静态最终哈希表_URL=新哈希表();
静态最终哈希表_IMG=新哈希表();
私有静态void initCode(字符串代码,字符串imgFName){
字符串标签;
//准备在线使用的表格
//使用实时url生成img标记
tag=MessageFormat.format(STR_FRMT_IMG,新对象[]{STR_IMG_URL
+imgFName});
表URL.put(代码、标签);
//准备表格以供脱机使用
//从项目资源中检索图像
试一试{
EncodedImage img=EncodedImage.getencodedimagesource(imgFName);
//使用嵌入的数据url生成img标记
字符串dataStr=getDataUrl(img.getData(),img.getMIMEType());
tag=MessageFormat.format(STR_FRMT_IMG,新对象[]{dataStr});
表\u IMG.put(代码、标签);
}捕获(IOE异常){
System.out.println(“\n为代码准备res时遇到问题”+代码
+“\n”);
}
}
静止的{
初始化代码(STR_CODE_SMILE,STR_IMG_NAME_SMILE);
初始化代码(STR_CODE_SADSMILE,STR_IMG_NAME_SADSMILE);
初始化代码(STR_CODE_WINK,STR_IMG_NAME_WINK);
}
布尔值=true;
字符串mChatHistory=“”;
BrowserField mBrowserField=新BrowserField();
EditField mTextField=新的EditField(“输入消息:”,“”,
INT_MSG_MAX_LEN,字段。使用所有宽度);
ButtonField mBtnUserLeft=新的ButtonField(“作为左先生发送”,
Field.Field_LEFT | ButtonField.consum_CLICK);
ButtonField mBtnUserRight=新的ButtonField(“作为右先生发送”,
Field.Field_RIGHT | ButtonField.consum_CLICK);
公共聊天屏幕(){
超级(Manager.NO_垂直滚动条| Manager.NO_水平滚动条);
添加(mTextField);
HorizontalFieldManager hfm=新的HorizontalFieldManager(
Field.USE_ALL_WIDTH | Field.Field_HCENTER);
mBtnUserLeft.setChangeListener(这个);
mBtnUserRight.setChangeListener(此);
hfm.add(mBtnUserLeft);
hfm.add(mBtnUserRight);
添加(hfm);
VerticalFieldManager vfm=新的VerticalFieldManager(Field.USE\u ALL\u WIDTH
|Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR);
vfm.add(mBrowserField);
添加(vfm);
}
受保护的void makeMenu(菜单菜单,int实例){
添加(新菜单项(脱机错误?“联机”:“脱机”,0,0){
公开募捐{
mIsOffline=!mIsOffline;
}
});
makeMenu(菜单,实例);
}
公共无效字段已更改(最终字段,int上下文){
如果(字段==mBtnUserLeft){
addMessage(“左先生”);
}else if(字段==mBtnUserRight){
addMessage(“右先生”);
}
}
私有void addMessage(字符串用户名){
String message=mTextField.getText();
//使用表情符号更新消息
message=replaceCodeWithImg(message,STR\u CODE\u SMILE);
message=replaceCodeWithImg(message,STR\u CODE\u SADSMILE);
message=replaceCodeWithImg(message,STR\u CODE\u WINK);
字符串timeStr=FRMT_TIME.format(新日期(System.currentTimeMillis());
String text=MessageFormat.format(STR\u FRMT\u MSG,new Object[]{
用户名、timeStr、message});
mChatHistory=文本+mChatHistory;
mTextField.setText(“”);
//将非法状态异常修复到
// http://supportforums.blackberry.com/t5/Java-Development/IllegalStateException-at-displayContent-on-browserfield/td-p/1071991
mBrowserField.setFocus();
显示内容(“+mChatHistory+”,“”);
}
P