2009-09-21 4 views
2

Я внедрил некоторые настраиваемые поля и хотел бы поддерживать внешний вид в соответствии с текущей темой Blackberry. Поэтому я хотел бы, чтобы цвет подсветки полей соответствовал цвету выделения, используемому во всех приложениях BB.Как получить цвет подсветки текущей темы Blackberry?

Как я могу получить этот цвет?

Редактировать: По-видимому, есть no way, чтобы получить эти цвета из любого API. Итак, есть ли способ обхода этих цветов?

+0

Привет, пожалуйста, опишите термин «выделение цвета». Является ли цвет сфокусированным фоном или цветом выделения текста или чем-то еще? –

+0

Цвет фона сфокусированного объекта. Например, тема по умолчанию на симуляторе имеет цвет «0x1055ad». –

ответ

3

Что мы можем сделать, это тест цвета по методу drawFocus некоторого пользовательского текстового поля:

class TestField extends TextField { 
    TestThemeListener mListener; 
    public TestField(TestThemeListener listener) { 
     super(EDITABLE | FOCUSABLE); 
     setText("Hello this is a color test"); 
     setSelection(0, true, 10); 
     mListener = listener; 
    } 
    protected void drawFocus(Graphics g, boolean on) { 
     drawHighlightRegion(g, HIGHLIGHT_FOCUS, true, 0, 0, 50, 20); 
     Bitmap bmp = new Bitmap(50, 20); 
     Display.screenshot(bmp, 0, 0, 50, 20); 
     int[] argbData = new int[1]; 
     bmp.getARGB(argbData, 0, 1, 0, 0, 1, 1); 
     int focusColor = argbData[0]; 
     drawHighlightRegion(g, HIGHLIGHT_SELECT, true, 50, 0, 50, 20); 
     Display.screenshot(bmp, 50, 0, 50, 20); 
     argbData = new int[1]; 
     bmp.getARGB(argbData, 0, 1, 0, 0, 1, 1); 
     int selectionColor = argbData[0]; 
     if (null != mListener) { 
      mListener.themeTested(focusColor, selectionColor); 
      mListener = null; 
     } 
    } 
} 

interface TestThemeListener { 
    void themeTested(int focusColor, int selectionColor); 
} 

и использовать его на экране:

class Scr extends MainScreen implements TestThemeListener { 
    LabelField mSelectionColorName; 
    LabelField mFocusColorName; 
    public Scr() { 
     add(new TestField(this)); 
    } 
    public void themeTested(int focusColor, int selectionColor) { 
     add(new LabelField("Theme colors (AARRGGBB)")); 
     add(new LabelField("Focus : " + focusColor)); 
     Bitmap bmpF = new Bitmap(100, 20); 
     Graphics gF = new Graphics(bmpF); 
     gF.setColor(focusColor); 
     gF.fillRect(0, 0, 100, 20); 
     add(new BitmapField(bmpF)); 
     add(new LabelField("Selection : " + selectionColor)); 
     Bitmap bmpS = new Bitmap(100, 20); 
     Graphics gS = new Graphics(bmpS); 
     gS.setColor(selectionColor); 
     gS.fillRect(0, 0, 100, 20); 
     add(new BitmapField(bmpS)); 
    } 
} 

color test app screenshot http://img188.imageshack.us/img188/8943/830001.png

+0

Вы, по сути, просто выталкиваете пиксель в скриншоте, чтобы получить его цвет. Это похоже на действительно круглый способ получить информацию. Для этого также требуется использование подписанного API ('Display' требует подписания). Я бы предпочел решение, которое было бы более эффективным, чем съемка экрана, и не требует подписания. –

1

Это прекрасно работает, но существует проблема. Приложение должно быть подписано, и оно отображает подтверждение для пользователя, чтобы сделать снимки экрана, такие как «Приложение xxx хочет снять снимок экрана. Разрешить?» Это может раздражать пользователя. Это вызвано использованием безопасного API в классе устройства.

Вместо этого попробуйте создать новый Graphics с Bitmap, а затем нарисуйте его.

class TestField : extends Field { 
    int getHighlightColor() { 
     Bitmap image = new Bitmap(getWidth(), getHeight()); 
     Graphics g = new Graphics(image). 
     drawHighlightRegion(g, Field.HIGHLIGHT_FOCUS, true, 0, 0, getWidth(), getHeight()); 
     paint(
     argbData = new int[1]; 
     image.getARGB(argbData, 0, 1, 0, 0, 1, 1); 
     return argbData[0]; 
    } 
} 
Смежные вопросы