2009-12-16 2 views
1

J'ai un bitmap en arrière-plan dans mon écran d'application Blackberry. L'écran a le défilement activé car je dois avoir un défilement. Le problème auquel je suis confronté est, lorsque je fais défiler la page, bitmap d'arrière-plan ne correspond pas à la page défilée, plutôt qu'il montre simplement fond blanc. Avons-nous besoin de dessiner le bitmap d'arrière-plan pour chaque page de défilement?BlackBerry - Bitmap en arrière-plan ne convient pas pour la page de défilement

Ma taille bitmap est: 360 * 480

code mis à jour est le suivant:

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); 
    } 
} 

}

APPELER LE CODE CI-DESSUS BITMAP CONTEXTE DE L'AUTRE FICHIER CI-DESSOUS:

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)); 

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

}

+0

Salut! voir le code mis à jour! –

+0

Salut Max, code mis à jour est très bien.Mais ça ne fonctionne que pour la première page, je voulais dire que je dois avoir une barre de défilement pour l'écran où je garde aussi le bitmap d'arrière-plan avec votre code.Dans ce cas, le code modifié , montre bitmap pour seulement la première page et pas dans la deuxième page après défilement vers le bas.Et aussi comme j'observe le samething comme précédemment, il crée toujours les deux pages par défaut initialement à partir de laquelle la deuxième page n'est pas nécessaire cependant. Je mets à jour mon code maintenant pour vous montrer comment c'est. – Getsy

Répondre

2

Pour obtenir la position réelle de défilement, vous pouvez utiliser 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); 
     } 
    } 
} 

alt text http://img693.imageshack.us/img693/6245/9000.jpg
Exemple d'utilisation:

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)); 
     } 
    } 
} 
+0

Lorsque j'ai ajouté le premier ensemble de code et le compiler, il renvoie l'erreur "impossible de trouver le symbole getMainManager()". J'ai importé import net.rim.device.api.ui.Manager ;, mais en observant toujours la même erreur. Est-ce que je fais quelque chose de mal? – Getsy

+0

J'ai aussi import net.rim.device.api.ui.container.MainScreen; mais toujours la même erreur. – Getsy

+0

Veuillez vérifier le code mis à jour. –

1

réponse Max Gontar est un tueur de la batterie; Comme invalidate() entraînera un appel à paintBackground (Graphics).