现在,我正在试图弄清楚如何实施以下内容:
假设我有一个自定义管理器,它有大约10个左右的BitmapField以水平方式布局(类似于HFM中包含的幻灯片)。我想要实现的是能够通过touchEvent水平移动图像HFM,其中BitmapField将焦点放在自定义管理器的左侧。换句话说,我是否必须为setHorizontalScroll赋值,如果是,那么只需在用户进行左或右触摸事件时递增该值即可。另外,当HFM通过touchEvent横向滚动时,如何在屏幕上的给定位置(即HFM上最左侧的Field)内获得Field的焦点?
答案 0 :(得分:0)
1 - 是的,setHorizontalScroll应该可以工作,不要忘记在经理构造函数中使用HORIZONTAL_SCROLL
2 - 尝试为每个字段getContentRect()测试EventTouch getX(int)和getY(int)
更新
要简化全局字段位置计算,请使用
public XYPoint getGlobalXY(Field field) {
XYPoint result = new XYPoint(field.getLeft(), field.getTop());
if (field.getManager() != null) {
result.translate(getGlobalXY(field.getManager()));
}
return result;
}
线程安全消息对话框:
public void showMessage(final String message) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
Dialog.inform(message);
}
});
}
示例代码:
class Scr extends MainScreen {
HorizontalFieldManager hfm;
public Scr() {
add(new LabelField("asdfsad"));
hfm = new HorizontalFieldManager(HORIZONTAL_SCROLL);
for (int i = 0; i < 5; i++) {
Bitmap bmp = new Bitmap(100, 100);
Graphics g = Graphics.create(bmp);
g.setFont(g.getFont().derive(100));
String txt = String.valueOf(i);
int x = g.getFont().getAdvance(txt);
g.drawText(txt, x, 0);
BitmapField bf = new BitmapField(bmp);
hfm.add(bf);
}
add(hfm);
}
protected boolean touchEvent(TouchEvent message) {
if (message.getEvent() == TouchEvent.CLICK) {
int x = message.getX(1);
int y = message.getY(1);
XYRect r = hfm.getExtent();
r.setLocation(getGlobalXY(hfm));
if (r.contains(x, y)) {
XYRect rf = hfm.getField(2).getExtent();
rf.setLocation(getGlobalXY(hfm.getField(2)));
if (x < rf.x) {
showMessage("left side");
} else if (x > rf.X2()) {
showMessage("right side");
} else {
showMessage("field");
}
}
}
return super.touchEvent(message);
}
}