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