Фоновое изображение за двумя полями в пользовательском HorizontalFieldManager

#blackberry

#ежевика

Вопрос:

Приведенный ниже код определяет горизонтальный менеджер полей с двумя полями. Как я могу изменить код, чтобы фон устанавливался только для двух добавляемых полей, а не для всего менеджера. Обратите внимание, я не пытаюсь добавить отдельное фоновое изображение к каждому из полей, вместо этого общее фоновое изображение, которое простирается за двумя полями.

  LabelField label = new LabelField("name");

            TextField e = new TextField(Field.FOCUSABLE);

            final Bitmap b = Constants.SETTINGS;
            final Background bg = BackgroundFactory.createBitmapBackground(Constants.SETTINGS);

            HorizontalFieldManager manager = new HorizontalFieldManager()
            {
                public void sublayout (int width, int height)
                {

                    Field field;
                    int x = 0;

                    super.sublayout(b.getWidth(), height);
                    super.setExtent(b.getWidth(), height);
                    for (int i = 0; i < getFieldCount(); i  )
                    {
                        field = getField(i);
                        layoutChild(field, Display.getWidth()/2, height);
                        setPositionChild(field, x, 10);
                        x  = Display.getWidth()/2;
                    }
                }
            };
            manager.add (label);
            manager.add (e);
            add (manager);
  

Изображение желаемого эффекта

Комментарии:

1. Насколько я понимаю из кода, вы пытаетесь добавить два поля, каждое из которых занимает половину экрана? Хочу проверить, прежде чем предлагать решение, которое может быть совершенно неуместным для того, что вы хотите сделать.

2. Это правильно. Поле метки и текстовое поле, каждое из которых занимает половину экрана, с общим фоном изображения. Я прикрепил скриншот желаемого эффекта. Спасибо.

Ответ №1:

Вместо того, чтобы помещать их в пользовательский менеджер, может быть проще просто переопределить вызовы Fields ‘ layout(), чтобы быть

 protected void layout(int width, int height) {
    super.layout(width, height);
    setExtent(Display.getWidth()/2, this.getHeight());
}
  

и тогда вы можете просто использовать обычный HorizontalFieldManager, для которого вы можете установить фон и отступы ( hfm.setPadding(10, 10, 10, 10); ). Добавление отступа уменьшит доступную ширину для ваших полей, поэтому вам следует уменьшить их ширину в вызовах layout().

Комментарии:

1. Привет, jprofitt … я переопределил этот метод компоновки, но получаю ошибку времени компиляции, которая «Не может переопределить окончательный метод из Manager»

2. В Manager обычно вам приходится выполнять работу в sublayout() , а не layout() потому что они объявляют ее окончательной

Ответ №2:

Вы можете компенсировать каждый из их отдельных фонов с помощью какой-нибудь причудливой дорогостоящей обработки растрового изображения (математика), чтобы казалось, что они «разделяют» одно изображение с помощью setBackground(), или вы можете переопределить их методы рисования для достижения того же эффекта с возможностью «перемещения» по растровому изображению в соответствии с их относительным положением… Это то, что вам нужно? 🙂

редактировать: создайте пользовательское поле для использования вашего растрового изображения и добавляйте в него любой контент, который вы хотели бы, затем переопределите paint, чтобы нарисовать то, что вам нравится, там, где вам это нравится…

 protected void paint(Graphics g){
    // conditionals, etc 
    g.drawBitmap(x, y, width, height, bitmap, left, top); 
    // color changes, etc 
    g.drawText(yourText); 
    // clean up 
}
  

Комментарии:

1. Я бы хотел, чтобы два этих поля имели общий фон изображения. Я приложил скриншот того, чего я пытаюсь достичь. Спасибо.