2011-12-22 2 views
0

Я создаю цветовой выбор из SeekBar. До сих пор, я успешно заменил прогресс вытяжке в OnCreate() следующим образом:Как получить ширину для правильной настройки LinearGradient

SeekBar colorChooser = (SeekBar) findViewById(R.id.seekBarColorChooser); 

    LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f, 
      new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
            0xFF00FFFF, 0xFF0000FF, 
            0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 

    RoundRectShape roundedRect = new RoundRectShape(new float [] {10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f} , null, null); 

    ShapeDrawable shape = new ShapeDrawable(roundedRect); 
    shape.getPaint().setShader(rainbow); 

    colorChooser.setProgressDrawable((Drawable) shape); 

Это отлично работает! Результат - именно то, что я ищу, однако, одна вещь, которая касается меня, - это жесткая кодированная ширина (100f) в LinearGradient.

Поскольку это диалоговое окно еще не реализовано, ни SeekBar, ни Dialog, похоже, не имеют ширины. Другими словами, colorChooser.getWidth() возвращает 0.

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

Спасибо!

ответ

1

Вы можете добавить dimension к своим ресурсам, что, конечно же, может иметь разные значения для разных экранов - оно также будет масштабироваться соответствующим образом, если у вас нет определенного определенного разрешения (например).

+0

Спасибо за идею. Он все еще немного похож на жесткое кодирование, но он работает. Я уверен, что мои проблемы будут смягчены, как только я проведу проверку на другой платформе. Спасибо! – Chris

+0

Ну, так или иначе вы определяете размер своих компонентов после графики или обертывания контента - поскольку ваш прогресс доступен, у вас нет содержимого (я полагаю), вам нужно будет указать размер для него - лучше это будет который может быть правильно настроен в соответствии с устройством. – Jens

1

Заменить

LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f, 
     new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
           0xFF00FFFF, 0xFF0000FF, 
           0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 

с

LinearGradient rainbow = new LinearGradient(0f, 0f, 500f, 0f, 
     new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
           0xFF00FFFF, 0xFF0000FF, 
           0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 
Смежные вопросы