BlackBerry - фоновое растровое изображение не подходит для прокрутки страницы

У меня есть фоновое растровое изображение на экране приложения Blackberry. На экране включена прокрутка, так как я должен иметь прокрутку. Проблема, с которой я столкнулся, заключается в том, что когда я прокручиваю страницу вниз, растровое изображение фона не подходит для прокручиваемой страницы, а показывает просто белый фон. Нужно ли рисовать фоновое растровое изображение для каждой прокручиваемой страницы?

Размер моего растрового изображения: 360 * 480

Обновленный код:

class BGVerticalFieldManager extends VerticalFieldManager {
    Bitmap mBgBitmap = null;
    int mBgWidth = -1;
    int mBgHeight = -1;
    int mBgX = -1;
    int mBgY = -1;

    public BGVerticalFieldManager(Bitmap background) {
            super(USE_ALL_WIDTH | USE_ALL_HEIGHT | VERTICAL_SCROLL
                            | VERTICAL_SCROLLBAR);
            mBgBitmap = background;
            mBgWidth = mBgBitmap.getWidth();
            mBgHeight = mBgBitmap.getHeight();
            mBgX = (Display.getWidth() - mBgWidth) >> 1;
            mBgY = (Display.getHeight() - mBgHeight) >> 1;

    }

    protected void paintBackground(Graphics graphics) {
            paintBackgroundBitmap(graphics);
            invalidate();
    }

    /*private void paintBackgroundBitmap(Graphics graphics) {
            if (null != mBgBitmap) {
                    int x = mBgX + ((MainScreen)getScreen())
                        .getMainManager().getHorizontalScroll();
                    int y = mBgY + ((MainScreen)getScreen())
                        .getMainManager().getVerticalScroll();

                    graphics.drawBitmap(x, y, mBgWidth, 
                        mBgHeight, mBgBitmap, 0, 0);
            }
    } */
    private void paintBackgroundBitmap(Graphics graphics) {
    if (null != mBgBitmap) {
        int x = mBgX
                + getHorizontalScroll();
        int y = mBgY
                + getVerticalScroll();
        graphics.drawBitmap(x, y, mBgWidth, mBgHeight, mBgBitmap, 0, 0);
    }
}

}

ВЫЗОВ ВЫШЕГО КОДА ФОНОВОГО BITMAP ИЗ ДРУГОГО ФАЙЛА, КАК НИЖЕ:

public MyFirstScreen ( String label, int screenState, int selectedObj, boolean bUI ) 
{    

   super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR); // I must need it ...

   appTitle = label;
   setTitle(appTitle);

   background = Bitmap.getBitmapResource ("HomeBack.png");        
   add(_container = new BGVerticalFieldManager(background));

   ..............................
   ..............................
   ..............................

}


person Getsy    schedule 16.12.2009    source источник
comment
Привет Макс, Обновленный код в порядке, но он работает (показывает) только для первой страницы, я имел в виду, что у меня должна быть полоса прокрутки для экрана, где я также сохраняю фоновое растровое изображение с вашим кодом. В этом случае измененный код, действительно показывает растровое изображение только для первой страницы, а не на второй странице после прокрутки вниз. И также, поскольку я наблюдаю то же самое, что и раньше, он по-прежнему создает две страницы по умолчанию изначально, из которых вторая страница не требуется. Я обновляю свой код, чтобы показать вам, как он есть.   -  person Getsy    schedule 29.12.2009


Ответы (2)


Чтобы получить фактическое положение прокрутки, вы можете использовать getVerticalScroll ():

class BGVerticalFieldManager extends VerticalFieldManager {
    Bitmap mBgBitmap = null;
    int mBgWidth = -1;
    int mBgHeight = -1;
    int mBgX = -1;
    int mBgY = -1;

    public BGVerticalFieldManager(Bitmap background) {
        super(USE_ALL_WIDTH | USE_ALL_HEIGHT | VERTICAL_SCROLL
                | VERTICAL_SCROLLBAR);
        mBgBitmap = background;
        mBgWidth = mBgBitmap.getWidth();
        mBgHeight = mBgBitmap.getHeight();
        mBgX = (Display.getWidth() - mBgWidth) >> 1;
        mBgY = (Display.getHeight() - mBgHeight) >> 1;

    }

    protected void paintBackground(Graphics graphics) {
        paintBackgroundBitmap(graphics);
        invalidate();
    }

    private void paintBackgroundBitmap(Graphics graphics) {
        if (null != mBgBitmap) {
            int x = mBgX
                    + getHorizontalScroll();
            int y = mBgY
                    + getVerticalScroll();
            graphics.drawBitmap(x, y, mBgWidth, mBgHeight, mBgBitmap, 0, 0);
        }
    }
}

http://img693.imageshack.us/img693/6245/9000.jpg
Пример использования:

class Scr extends MainScreen {

    private BGVerticalFieldManager mContainer;

    public Scr() {
        super(NO_VERTICAL_SCROLL);
        setTitle("Screen Title");
        Bitmap bitmap = Bitmap.getBitmapResource("BoldOEM.jpg");
        add(mContainer = new BGVerticalFieldManager(bitmap));
        for (int i = 0; i < 100; i++) {
            mContainer.add(new LabelField("List item #" + String.valueOf(i)));
            mContainer.add(new NullField(FOCUSABLE));
        }
    }
}
person Maksym Gontar    schedule 17.12.2009
comment
Когда я добавил первый набор кода и скомпилировал его, он выдает ошибку, так как «не удается найти символ getMainManager ()». Я импортировал import net.rim.device.api.ui.Manager ;, но все еще наблюдаю ту же ошибку. Я что-то делаю не так? - person Getsy; 18.12.2009
comment
У меня также есть import net.rim.device.api.ui.container.MainScreen; но все та же ошибка. - person Getsy; 18.12.2009
comment
Я просмотрел код, чтобы понять, а затем протестировал, он работает как Charm! Большое вам спасибо, очень ценю вашу своевременную помощь! - person Getsy; 18.12.2009
comment
Привет, Макс, я обнаружил проблему и столкнулся с одной проблемой с использованием вашего кода. Как я уже упоминал, я добавил ваш код для применения фонового растрового изображения в фоновом режиме экранов моего приложения без каких-либо проблем. Но теперь я вижу, что по умолчанию он создает две страницы (мы можем прокрутить до второй страницы, хотя там нет элементов управления) вместо одной страницы изначально. Поскольку мне нужна полоса прокрутки для экранов моих приложений, я добавил super (VERTICAL_SCROLL | VERTICAL_SCROLLBAR) ;. Но у меня есть элементы управления только на одной странице, если пользователь что-то вводит, тогда потребуется прокрутка. Но этот код создает вторую страницу также по умолчанию, когда 2-я страница отсутствует. - person Getsy; 25.12.2009
comment
Всем привет! Можете ли вы обновить свой вопрос кодом, который вы упомянули? - person Maksym Gontar; 26.12.2009
comment
На самом деле я сохраняю тот же ваш код (ответ 1) в файле java, а затем вызываю его из других файлов, как показано ниже: background = Bitmap.getBitmapResource (HomeBack.png); добавить (_container = новый BGVerticalFieldManager (фон)); --- Добавление здесь других элементов управления, таких как LabelField, EditField и т. Д. Я держу полосу прокрутки для этих экранов. Но после вызова класса для рисования растрового фона экрана я увидел, что он создает две страницы. - person Getsy; 26.12.2009

Ответ Макса Гонтара - убийца батарей;

protected void paintBackground(Graphics graphics) {
  paintBackgroundBitmap(graphics);
  invalidate();
}

Поскольку invalidate () приведет к вызову paintBackground (Graphics).

person 1in9ui5t    schedule 17.09.2010