ここでは、トップ バー、カスタムの垂直スクロール マネージャー、Editfield
メッセージを送信するためのボタン、および送信ボタンを含むチャット用の画面を作成しています。
次に、メッセージ レイアウトを作成します。これにはVerticalFieldManager
、EditField
フォーカス可能で読み取り専用のメッセージ レイアウトとLabelField
、名前と日付用の 2 つの があります。この垂直フィールド マネージャーは、チャット メッセージの数に応じて動的に作成されます。これはすべてカスタムスクロールでレイアウトされています。
画面の下からスクロールする必要があります。今のところ、画面の上から動作します。
画面の下部に送信ボタンがBasicEditField
あります。
7 秒ごとにページを更新し、ページを更新するときにレイアウト全体を再作成します。BasicEditField
そのため、ページが更新されるたびにフォーカスを維持する必要があります。また、スクロールを逆にしたいです。
ここに私の垂直スクロールマネージャークラス
public class VerticalScrollManager extends VerticalFieldManager implements
ScrollChangeListener {
public VerticalScrollManager() {
this(VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR|DOWNWARD, Integer.MAX_VALUE, Integer.MAX_VALUE);
}
public VerticalScrollManager(int w, int h) {
this(VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR|DOWNWARD, w, h);
}
public VerticalScrollManager(long style) {
this(style, Integer.MAX_VALUE, Integer.MAX_VALUE);
}
public VerticalScrollManager(long style, int w, int h) {
super(style);
maxVisibleHeight = h;
maxVisibleWidth = w;
setScrollListener(this);
}
protected void sublayout(int w, int h) {
isScrolling = ((getStyle() & VERTICAL_SCROLL) == VERTICAL_SCROLL);
int scrollbarWidth = isScrolling ? SCROLLBAR_WIDTH + SCROLLBAR_LEFT_MARGIN + SCROLLBAR_RIGHT_MARGIN : 0;
visibleHeight = Math.min(h, maxVisibleHeight);
visibleWidth = Math.min(w, maxVisibleWidth);
int myWidth = visibleWidth - scrollbarWidth;
super.sublayout(myWidth, visibleHeight);
visibleHeight = getHeight();
totalHeight = getVirtualHeight();
visibleWidth = getWidth() + scrollbarWidth;
setExtent(visibleWidth, visibleHeight);
setVirtualExtent(visibleWidth, totalHeight);
isScrolling = (visibleHeight < totalHeight);
if (isScrolling) {
sliderHeight = visibleHeight * visibleHeight / totalHeight;
sliderHeight = Math.max(sliderHeight, 1); // show at least one pixel!
sliderXPosition = visibleWidth - SCROLLBAR_WIDTH - SCROLLBAR_RIGHT_MARGIN;
}
}
public void scrollChanged(Manager mgr, int newX, int newY) {
if (mgr == this) {
invalidate(newX + sliderXPosition, newY, SCROLLBAR_WIDTH + SCROLLBAR_RIGHT_MARGIN, getVisibleHeight());
}
}
}
そしてここに、UIと機能を処理する私の画面があります
public class ChatScreen extends MainScreen implements FieldChangeListener, FocusChangeListener {
class MainTask implements Runnable
{
public MainTask()
{}
public void run() {
try
{
if(textMsg.getText().equals(""))
{
IssueHTTPPostL();
}
else
{
IssueHTTPPostChat(textMsg.getText());
}
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
if(replyCode.equalsIgnoreCase("success"))
{
if(chatMsgData!=null && chatMsgData.length>0 )
{
for( int i=0; i<chatMsgData.length; i++)
{
final String name = chatMsgData[i].name;
final String email = chatMsgData[i].email;
final String date = chatMsgData[i].date;
final String msg = chatMsgData[i].message;
final String vappUser = chatMsgData[i].vappUser;
if(chatMsgData[i].isReply.equals("0"))
{
vfm = new VerticalFieldManager(VerticalFieldManager.FIELD_RIGHT)
{
protected void paintBackground(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRoundRect(30, 0, getWidth()-30, getHeight(), 12, 12);
g.setColor(0X626262);
g.drawRoundRect(30, 0, getWidth()-30, getHeight(), 12, 12);
//g.drawBitmap(0,0,getWidth(),getHeight(),imgRight,0,0);
}
};
lblName = new LabelField(name, LabelField.FIELD_LEFT|DrawStyle.LEFT)
{
protected void paint(Graphics g)
{
g.setColor(Color.BLACK);
super.paint(g);
};
};
if(name.equals("")||name.equals("Name"))
{
lblName.setText(email);
}
lblDate = new LabelField(date, LabelField.FIELD_RIGHT|DrawStyle.RIGHT);
lblDate.setFont(font.derive(Font.PLAIN, dateFontSize));
lblName.setFont(font.derive(Font.BOLD, nameFontSize));
JustifiedHorizontalFieldManager hfm = new JustifiedHorizontalFieldManager(lblName, lblDate, true);
hfm.setMargin(10, 10, 10, 50);
lblMsg = new EditField(EditField.FOCUSABLE|EditField.READONLY)
{
protected void paint(Graphics g)
{
g.setColor(0x626262);
super.paint(g);
};
};
lblMsg.setText(msg);
lblMsg.setMargin(10, 10, 10, 50);
lblMsg.setFont(font.derive(Font.PLAIN, msgFontSize));
vfm.add(hfm);
vfm.add(lblMsg);
vfm.setMargin(10, 20, 10, 0);
}
else
{
vfm = new VerticalFieldManager(VerticalFieldManager.FIELD_LEFT)
{
protected void paintBackground(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRoundRect(0, 0, getWidth()-30, getHeight(), 12, 12);
g.setColor(Color.BLACK);
g.drawRoundRect(0, 0, getWidth()-30, getHeight(), 12, 12);
//g.drawBitmap(0,0,getWidth(),getHeight(),imgLeft,0,0);
}
};
lblName = new LabelField(vappUser, LabelField.FIELD_LEFT|DrawStyle.LEFT)
{
protected void paint(Graphics g)
{
g.setColor(Color.BLACK);
super.paint(g);
};
};
if(name.equals("")||name.equals("Name"))
{
lblName.setText(email);
}
lblDate = new LabelField(date, LabelField.FIELD_RIGHT|DrawStyle.RIGHT)
{
protected void paint(Graphics g)
{
g.setColor(0X626262);
super.paint(g);
};
};
lblDate.setFont(font.derive(Font.PLAIN, dateFontSize));
lblName.setFont(font.derive(Font.BOLD, nameFontSize));
JustifiedHorizontalFieldManager hfm = new JustifiedHorizontalFieldManager(lblName, lblDate, true);
//hfm.setMargin("top", "right", "bottom", "left");
hfm.setMargin(10, 50, 10, 10);
lblMsg = new EditField(EditField.FOCUSABLE|EditField.READONLY)
{
protected void paint(Graphics g)
{
g.setColor(0x626262);
super.paint(g);
};
};
lblMsg.setText(msg);
lblMsg.setMargin(10, 40, 10, 10);
lblMsg.setFont(font.derive(Font.PLAIN, msgFontSize));
vfm.add(hfm);
vfm.add(lblMsg);
vfm.setMargin(10, 10, 20, 0);
}
vsm.add(vfm);
}
}
add(vsm);
add(sendHfm);
}
else
{
timer.cancel();
UiApplication.getUiApplication().popScreen(ChatScreen.this);
UiApplication.getUiApplication().pushScreen(new ChatListScreen());
}
}
});
}
catch(Exception e)
{e.printStackTrace();}
}
}
}