2015-10-28 5 views
0

Je suis en train de faire l'image touchable qui peut se concentrer quand je défiler par bouton sur l'appareil touchable ceci est mon code pour l'image touchable:Blackberry Ajouter une bordure à l'image lorsque le focus

class TouchBitmapField extends BitmapField { 
    Bitmap bitmap; 
    boolean second; 
    int width; 
    public TouchBitmapField(Bitmap startBitmap, long style, int width, boolean second) { 
     super(startBitmap, style); 
     this.second = second; 
     bitmap = startBitmap; 
     this.width = width; 
    } 

    protected void drawFocus(Graphics g, boolean on){ 
     g.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS, true); 
     if(on){ 
      drawHighlightRegion(g, Field.HIGHLIGHT_FOCUS, on, width-(bitmap.getWidth()/2), 0, bitmap.getWidth(), bitmap.getHeight()); 
     } 

     paint(g); 
    } 
    protected boolean touchEvent(TouchEvent message) { 
     if (TouchEvent.CLICK == message.getEvent()) { 
      FieldChangeListener listener = getChangeListener(); 
      if (null != listener) 
       listener.fieldChanged(this, 1); 
     } 
     return super.touchEvent(message); 
    } 
} 

Mais le problème est que seule partie transparente de l'image peut se concentrer et je résise ce bitmap avant de créer TouchBitmapField et comme vous le savez peut-être en train de réséquer bitmap supprimer la partie transparente et le remplacer par du noir. J'ai essayé cette classe http://www.patchou.com/2010/10/resizing-transparent-bitmaps-with-the-blackberry-jde/ pour redimensionner l'image mais j'ai 25 images sur mon écran et c'est inefficace. Une idée de comment faire la frontière sur l'image? Toute manière efficace de dessiner la frontière dans la méthode drawFocus(Graphics g, boolean on)?

Répondre

1

La raison pour laquelle vous pouvez uniquement faire la mise au point sur les parties transparentes d'une image est que (pour autant que je sache) drawFocus est déclenché avant paint, provoquant le dessin de l'image en dernier.

Je pense que cette solution est ce que vous cherchez. Si vous voulez autre chose qu'une couleur unie, vous pouvez jouer avec le BorderFactory.

class TouchBitmapField extends BitmapField 
{ 
    Bitmap bitmap; 
    Border defaultBorder; 
    Border focusBorder; 

    public TouchBitmapField(Bitmap startBitmap, long style) 
    { 
     super(startBitmap, style | FOCUSABLE); 
     bitmap = startBitmap; 

     XYEdges thickness = new XYEdges(5, 5, 5, 5); 
     XYEdges colours = new XYEdges(0xff0000, 0xff0000, 0xff0000, 0xff0000); 
     XYEdges alpha = new XYEdges(0, 0, 0, 0); 

     // Transparent border used by default, so that adding the focus border does not resize the view 
     defaultBorder = BorderFactory.createSimpleBorder(thickness, colours, alpha, Border.STYLE_SOLID); 
     focusBorder = BorderFactory.createSimpleBorder(thickness, colours, Border.STYLE_SOLID); 

     setBorder(defaultBorder); 
    } 

    protected void drawFocus(Graphics graphics, boolean on) 
    { 
     // Override default blue highlight 
    } 

    protected void onFocus(int direction) 
    { 
     super.onFocus(direction); 
     setBorder(focusBorder); 
    } 
    protected void onUnfocus() 
    { 
     super.onUnfocus(); 
     setBorder(defaultBorder); 
    } 
} 

Si vous voulez que votre frontière se chevaucher votre image, vous pouvez remplacer votre méthode paint et dessiner comme vous voulez.

protected void paint(Graphics graphics) 
    { 
     super.paint(graphics); 

     if(isFocus()) 
     { 
      int tempCol = graphics.getColor(); 
      int tempAlpha = graphics.getGlobalAlpha(); 

      graphics.setColor(0xff0000); 
      graphics.setGlobalAlpha(128); 

      for(int i = 0; i < 5; i++) 
      { 
       graphics.drawRect(i, i, getWidth() - i * 2, getHeight() - i * 2); 
      } 

      // Reset back to original state 
      graphics.setColor(tempCol); 
      graphics.setGlobalAlpha(tempAlpha); 
     } 
    }