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);
        }
    }
Другие вопросы по тегам