1). Прежде всего, с этим кодом
protected void layout(int width, int height) {
setExtent(width, height);
}
вы на самом деле устанавливаете ОЧЕНЬ большой размер поля. Это связано с тем, что структура пользовательского интерфейса BB передает максимально доступные / возможные измерения в layout(int width, int height)
, поэтому поле должно использовать некоторую часть в переданных значениях. В этом конкретном случае ширина будет шириной дисплея (360 пикселей), а высота - максимально возможной высотой VerticalFieldManager
(к которому вы добавляете поля экрана, он неявно присутствует во внутренних элементах экрана) ( 1073741823 px). Итак, в конечном итоге это может привести к очень большому Bitmap
объекту, который требуется с полем для рисования, и вы можете получить неперехваченную ошибку «Растровое изображение слишком велико» (я это делал в Storm 9530).
Итак, layout()
должен использовать несколько относительно небольших значений, например ::
protected void layout(int width, int height) {
setExtent(Math.min(width, 360), Math.min(height, 480));
}
2).
На самом деле touchEvent никогда не вызывается
Ну, на самом деле это называется. Чтобы увидеть, что вы должны просто коснуться (против щелчка). Левая кнопка мыши имитирует щелчки (последовательность TouchEvent.DOWN
> TouchEvent.CLICK
> TouchEvent.UNCLICK
> TouchEvent.UP
), правая кнопка имитирует касания (последовательность TouchEvent.DOWN
> TouchEvent.UP
).
3).
Кроме того, я получаю раздражающее «Полное меню», которое появляется при прикосновении к экрану.
Это потому, что ваше поле не использует TouchEvent.UNCLICK
событие. Например, с этим кодом ваше поле не будет отображать всплывающее окно:
protected boolean touchEvent(TouchEvent message) {
return true;
}
Но это плохое решение для всплывающего окна. Лучше понять, что на самом деле вызывает всплывающее окно. Если событие TouchEvent.UNCLICK
не используется, то инфраструктура пользовательского интерфейса BB вызывает getContextMenu(int instance)
и makeContextMenu(ContextMenu contextMenu, int instance)
методы поля. Таким образом, чтобы отключить всплывающее окно (которое на самом деле ContextMenu
создано getContextMenu(int instance)
, вы должны переопределить getContextMenu(int instance)
, чтобы получить что-то вроде этого:
public ContextMenu getContextMenu(int instance) {
// just in case check if a context menu is requested
// in order not to disable other types of menu
boolean isContextMenu = (Menu.INSTANCE_CONTEXT == instance);
return isContextMenu ? null : super.getContextMenu(instance);
}
4). Наконец, я бы порекомендовал не изменять родное / стандартное поведение метода touchEvent(TouchEvent message)
. Вы можете просто просмотреть / записать его, но не меняйте (всегда вызывайте его супер версию). Это связано с тем, что обработка сенсорных событий сложнее, чем кажется на первый взгляд. Здесь очень легко получить сложную ошибку. Я верю, что большинству программистов не следует изменять собственное поведение touchEvent(TouchEvent message)
, если они действительно не хотят создавать какой-либо пользовательский компонент пользовательского интерфейса для работы с сенсорными жестами. Обычно они просто хотят реагировать на клик (вести себя как ButtonField
), однако для этого вы можете просто переопределить navigationClick(int status, int time)
или navigationUnclick(int status, int time)
. Инфраструктура пользовательского интерфейса BB будет вызывать эти методы, когда пользователь нажимает ваше поле на сенсорном экране.