2015-10-28 4 views
0

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

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

Но проблема в том, что только прозрачная часть изображения может сфокусироваться, и я обновляю этот растровый файл до создания TouchBitmapField, и, как вы, возможно, знаете, что изменение размера растрового изображения удаляет прозрачную часть и заменяет ее черным. Я попробовал этот класс http://www.patchou.com/2010/10/resizing-transparent-bitmaps-with-the-blackberry-jde/, чтобы изменить размер изображения, но у меня есть 25 изображений на моем экране, и это неэффективно. Любая идея, как сделать границу на изображении? Любой эффективный способ рисования границы в методе drawFocus(Graphics g, boolean on)?

ответ

1

Причина, по которой вы можете фокусировать прозрачные части изображения, состоит в том, что (насколько мне известно) drawFocus уволен до paint, в результате чего растровое изображение будет нарисовано последним.

Я думаю, что это решение - это то, что вы ищете. Если вы хотите что-то отличное от сплошного цвета в качестве границы, вы можете играть с 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); 
    } 
} 

Если вы хотите, чтобы ваши границы, чтобы накладываться изображение, вы можете переопределить метод paint и рисовать, как вы хотите.

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); 
     } 
    } 
Смежные вопросы