Android - стильная панель поиска
Я хотел создать панель поиска, которая выглядит так, как показано на рисунке ниже.
![enter image description here]()
Используя стандартную панель поиска, я получу что-то вроде этого:
![enter image description here]()
Так что мне нужно только изменить цвет. Мне не нужны дополнительные стили. Есть ли прямой подход для этого или я должен создать свой собственный чертеж?
Я попытался создать пользовательский, но не смог получить точный, как показано выше.
После использования настраиваемого рисования я получаю, как показано ниже:
![enter image description here]()
Если мне нужно построить пользовательский, то предложите, как уменьшить ширину линии прогресса, а также форму.
Моя пользовательская реализация:
background_fill.xml:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="90"
android:centerColor="#FF555555"
android:endColor="#FF555555"
android:startColor="#FF555555" />
<corners android:radius="1dp" />
<stroke
android:width="1dp"
android:color="#50999999" />
<stroke
android:width="1dp"
android:color="#70555555" />
</shape>
progress_fill.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="90"
android:centerColor="#FFB80000"
android:endColor="#FFFF4400"
android:startColor="#FF470000" />
<corners android:radius="1dp" />
<stroke
android:width="1dp"
android:color="#50999999" />
<stroke
android:width="1dp"
android:color="#70555555" />
</shape>
progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/background_fill"/>
<item android:id="@android:id/progress">
<clip android:drawable="@drawable/progress_fill" />
</item>
</layer-list>
thumb.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<gradient
android:angle="270"
android:endColor="#E5492A"
android:startColor="#E5492A" />
<size
android:height="20dp"
android:width="20dp" />
</shape>
SeekBar:
<SeekBar
android:id="@+id/seekBarDistance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="88dp"
android:progressDrawable="@drawable/progress"
android:thumb="@drawable/thumb" >
</SeekBar>
Ответы
Ответ 1
Я извлек бы drawables и xml из исходного кода Android и изменил бы его цвет на красный. Вот пример того, как я завершил это для рисования mdpi:
Пользовательский red_scrubber_control.xml
(добавить в res/drawable):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/red_scrubber_control_disabled_holo" android:state_enabled="false"/>
<item android:drawable="@drawable/red_scrubber_control_pressed_holo" android:state_pressed="true"/>
<item android:drawable="@drawable/red_scrubber_control_focused_holo" android:state_selected="true"/>
<item android:drawable="@drawable/red_scrubber_control_normal_holo"/>
</selector>
Пользовательский: red_scrubber_progress.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/red_scrubber_track_holo_light"/>
<item android:id="@android:id/secondaryProgress">
<scale
android:drawable="@drawable/red_scrubber_secondary_holo"
android:scaleWidth="100%" />
</item>
<item android:id="@android:id/progress">
<scale
android:drawable="@drawable/red_scrubber_primary_holo"
android:scaleWidth="100%" />
</item>
</layer-list>
Затем скопируйте необходимые отрисовки из исходного кода Android, я взял по этой ссылке
Это хорошо, чтобы скопировать эти drawables для каждого hdpi, mdpi, xhdpi. Например я использую только mdpi:
Затем с помощью Photoshop измените цвет с синего на красный:
red_scrubber_control_disabled_holo.png: ![red_scrubber_control_disabled_holo]()
red_scrubber_control_focused_holo.png: ![red_scrubber_control_focused_holo]()
red_scrubber_control_normal_holo.png: ![red_scrubber_control_normal_holo]()
red_scrubber_control_pressed_holo.png: ![red_scrubber_control_pressed_holo]()
red_scrubber_primary_holo.9.png: ![red_scrubber_primary_holo.9]()
red_scrubber_secondary_holo.9.png: ![red_scrubber_secondary_holo.9]()
red_scrubber_track_holo_light.9.png: ![red_scrubber_track_holo_light.9]()
Добавьте SeekBar в макет:
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/red_scrubber_progress"
android:thumb="@drawable/red_scrubber_control" />
Результат:
![enter image description here]()
Ответ 2
Мой ответ вдохновлен Андрасом Балазом Лайтой
он позволяет работать без XML файла
seekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
seekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
Ответ 3
Если вы хотите точно такую же полосу, но красную, вы можете программно добавить цветной фильтр PorterDuff. Вы можете получить каждый рисунок, который хотите раскрасить, с помощью методов базового класса ProgressBar. Затем установите для него цветной фильтр.
mySeekBar.getProgressDrawable().setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.MULTIPLY));
Если нужную настройку цвета невозможно выполнить с помощью фильтра Портера Даффа, вы можете указать свой собственный цветовой фильтр.
Ответ 4
Пользовательский стиль материалов для панели поиска Android, для других настроек панели поиска http://www.zoftino.com/android-seekbar-and-custom-seekbar-examples
<style name="MySeekBar" parent="Widget.AppCompat.SeekBar">
<item name="android:progressBackgroundTint">#f4511e</item>
<item name="android:progressTint">#388e3c</item>
<item name="android:colorControlActivated">#c51162</item>
</style>
![seekbar custom material style]()
Ответ 5
Просто замените цветные атрибуты цветом
background.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke android:width="1dp" android:color="#D9D9D9"/>
<corners android:radius="1dp" />
</shape>
progress.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke android:width="1dp" android:color="#2EA5DE"/>
<corners android:radius="1dp" />
</shape>
style.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/seekbar_background"/>
<item android:id="@android:id/progress">
<clip android:drawable="@drawable/seekbar_progress" />
</item>
</layer-list>
thumb.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="30dp" android:width="30dp"/>
<stroke android:width="18dp" android:color="#882EA5DE"/>
<solid android:color="#2EA5DE" />
<corners android:radius="1dp" />
</shape>
Ответ 6
Google упростила это в SDK 21. Теперь у нас есть атрибуты для определения цвета оттенка большого пальца:
android:thumbTint
android:thumbTintMode
android:progressTint
http://developer.android.com/reference/android/widget/AbsSeekBar.html#attr_android:thumbTint http://developer.android.com/reference/android/widget/AbsSeekBar.html#attr_android:thumbTintMode
Ответ 7
Как упоминалось выше (@andrew), создание пользовательского SeekBar очень просто с этим сайтом - http://android-holo-colors.com/
Просто включите SeekBar, выберите цвет и получите все ресурсы и скопируйте для проекта.
Затем примените их в xml, например:
android:thumb="@drawable/apptheme_scrubber_control_selector_holo_light"
android:progressDrawable="@drawable/apptheme_scrubber_progress_horizontal_holo_light"
Ответ 8
Просто установите
android:maxHeight="3dp"
android:minHeight="3dp"
Все это
Ответ 9
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:progressTint="@color/red"
android:thumbTint="@color/red" />
Работает так же, как и выбранный ответ. нет необходимости делать какой-либо файл с возможностью рисования или иначе (только для IN 5.0)
С уважением
Ответ 10
Все эти ответы устарели.
В 2019 году проще настроить стиль панели поиска в соответствии с предпочтительным цветом, изменив свой ProgressBar
на этот
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progressTint="#36970f"
android:thumbTint="#36970f"
/>
Стилизовав цвет в строке поиска, попробуйте следующий код
seekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
seekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
Ответ 11
выход:
![enter image description here]()
в файле макета:
<android.support.v7.widget.AppCompatSeekBar
android:id="@+id/seekBar_bn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:max="25"
android:minHeight="10dp"
android:progress="10"
android:progressDrawable="@drawable/progress"
android:thumb="@drawable/custom_thumb" />
рисуем /progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/background_fill"/>
<item android:id="@android:id/progress">
<clip android:drawable="@drawable/progress_fill" />
</item>
</layer-list>
рисуем /background_fill.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="6dp"
android:left="-6dp"
android:right="-6dp"
android:top="6dp">
<shape android:shape="rectangle">
<solid android:color="#888888" />
<stroke
android:width="5dp"
android:color="@android:color/transparent" />
</shape>
</item>
</layer-list>
рисуем /progress_fill.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="6dp"
android:left="-6dp"
android:right="-6dp"
android:top="6dp">
<shape android:shape="rectangle">
<solid android:color="@color/myPrimaryColor" />
<stroke
android:width="5dp"
android:color="@android:color/transparent" />
</shape>
</item>
</layer-list>
рисуем /custom_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/myPrimaryColor"/>
<size
android:width="22dp"
android:height="22dp"/>
</shape>
</item>
</layer-list>
colors.xml
<color name="myPrimaryColor">#660033</color>
Ответ 12
По умолчанию андроид будет соответствовать цвету выполнения вашего слайдера на
`<item name="colorAccent">`
в styles.xml. Затем, чтобы установить изображение большого пальца пользовательского слайдера, просто используйте этот код в блоке макета SeekBar xml:
android:thumb="@drawable/slider"
Ответ 13
Если вы используете по умолчанию SeekBar, предоставленный android Sdk, то это простой способ изменить цвет этого. просто перейдите в color.xml внутри /res/values/colors.xml и измените colorAccent.
<resources>
<color name="colorPrimary">#212121</color>
<color name="colorPrimaryDark">#1e1d1d</color>
<!-- change below line -->
<color name="colorAccent">#FF4081</color>
</resources>
Ответ 14
LayerDrawable progressDrawable = (LayerDrawable) mSeekBar.getProgressDrawable();
// progress bar line *progress* color
Drawable processDrawable = progressDrawable.findDrawableByLayerId(android.R.id.progress);
// progress bar line *background* color
Drawable backgroundDrawable = progressDrawable.findDrawableByLayerId(android.R.id.background);
// progress bar line *secondaryProgress* color
Drawable secondaryProgressDrawable = progressDrawable.findDrawableByLayerId(android.R.id.secondaryProgress);
processDrawable.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
// progress bar line all color
mSeekBar.getProgressDrawable().setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
// progress circle color
mSeekBar.getThumb().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN);
Ответ 15
Я меняю background_fill.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<size android:height="1dp" />
<gradient
android:angle="0"
android:centerColor="#616161"
android:endColor="#616161"
android:startColor="#616161" />
<corners android:radius="0dp" />
<stroke
android:width="1dp"
android:color="#616161" />
<stroke
android:width="1dp"
android:color="#616161" />
</shape>
и progress_fill.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<size android:height="1dp" />
<gradient
android:angle="0"
android:centerColor="#fafafa"
android:endColor="#fafafa"
android:startColor="#fafafa" />
<corners android:radius="1dp" />
<stroke
android:width="1dp"
android:color="#cccccc" />
<stroke
android:width="1dp"
android:color="#cccccc" />
</shape>
чтобы сделать фон и прогресс 1dp
height.
Ответ 16
Простой способ изменить цвет строки поиска...
<ProgressBar
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:theme="@style/Progress_color"/>
Стиль: Progress_color
<style name="Progress_color">
<item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
</style>
изменение класса Java ProgressDrawable()
seek_bar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.MULTIPLY);
Ответ 17
Если вы посмотрите на ресурсы Android, панель поиска фактически использует изображения.
Вы должны сделать drawable, который прозрачен сверху и снизу, например, 10px, и видны линии центра 5px.
Обратитесь к прилагаемому изображению. Вам нужно преобразовать его в NinePatch.
![enter image description here]()
Ответ 18
Для тех, кто использует привязку данных:
-
Добавьте следующий статический метод в любой класс
@BindingAdapter("app:thumbTintCompat")
public static void setThumbTint(SeekBar seekBar, @ColorInt int color) {
seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
-
Добавить атрибут app:thumbTintCompat
в ваш SeekBar
<SeekBar
android:id="@+id/seek_bar"
style="@style/Widget.AppCompat.SeekBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:thumbTintCompat="@{@android:color/white}"
/>
Что это. Теперь вы можете использовать app:thumbTintCompat
с любым SeekBar
. Тонов выполнения можно настроить таким же образом.
Примечание: этот метод также совместим с устройствами с предварительным лепестком.
Ответ 19
Небольшая поправка к ответу @arnav-rao:
чтобы убедиться, что большой палец правильно окрашен, используйте:
<style name="MySeekBar" parent="Widget.AppCompat.SeekBar">
<item name="android:progressBackgroundTint">@color/colorBgTint</item>
<item name="android:progressTint">@color/colorProgressTint</item>
<item name="android:thumbTint">@color/colorThumbTint</item>
</style>
здесь android: thumbTint на самом деле окрашивает "большой палец"
Ответ 20
проверить этот урок очень хорошо
https://www.lvguowei.me/post/customize-android-seekbar-color/
просто:
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:maxHeight="3dp"
android:minHeight="3dp"
android:progressDrawable="@drawable/seekbar_style"
android:thumbTint="@color/positive_color"/>
затем файл стиля:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape android:shape="rectangle" >
<solid
android:color="@color/positive_color" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle" >
<solid
android:color="@color/positive_color" />
</shape>
</clip>
</item>
</layer-list>
Ответ 21
Я хотел создать стиль для панели поиска, а затем добавить стиль к теме, чтобы можно было применить его ко всей теме, при этом позволяя подстилю переопределять его. Вот что я сделал:
<!-- Blue App Theme -->
<style name="AppTheme.Blue" parent="BaseTheme.Blue">
<item name="android:seekBarStyle">@style/SeekbarStyle.Blue</item>
<item name="seekBarStyle">@style/SeekbarStyle.Blue</item> <!--This is essential for some devices, e.g. Samsung-->
</style>
<!-- Slider Styles -->
<style name="SeekbarStyle.Blue" parent="Widget.AppCompat.SeekBar">
<item name="android:progressBackgroundTint">@color/material_blue_a700_pct_30</item>
<item name="android:thumbTint">@color/material_blue_a700</item>
<item name="android:thumbTintMode">src_in</item>
<item name="android:progressTint">@color/material_blue_a700</item>
</style>
<style name="SeekbarStyle.Green" parent="Widget.AppCompat.SeekBar">
<item name="android:progressBackgroundTint">@color/material_green_a700_pct_30</item>
<item name="android:thumbTint">@color/material_green_a700</item>
<item name="android:thumbTintMode">src_in</item>
<item name="android:progressTint">@color/material_green_a700</item>
</style>
Приведенное выше устанавливает стиль панели поиска Theme на синий для всех устройств 21+, включая Samsung (которым требуется применение seekBarStyle в дополнение к android: seekBarStyle; не уверен, почему, но я видел эту проблему не понаслышке). Если вы хотите, чтобы все панели поиска сохраняли стиль темы и применяли зеленый стиль панели поиска только к нескольким виджетам, добавьте следующее к нужному виджету:
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.Green"/>
Ответ 22
Для API & lt; 21 (и> = 21) вы можете использовать ответ @Ahamadullah Saikat или https://www.lvguowei.me/post/customize-android-seekbar-color/.
![enter image description here]()
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="3dp"
android:minHeight="3dp"
android:progress="50"
android:progressDrawable="@drawable/seek_bar_ruler"
android:thumb="@drawable/seek_bar_slider"
/>
вытяжке /seek_bar_ruler.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<solid
android:color="#94A3B3" />
<corners android:radius="2dp" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle">
<solid
android:color="#18244D" />
<corners android:radius="2dp" />
</shape>
</clip>
</item>
</layer-list>
вытяжке /seek_bar_slider.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
>
<solid android:color="#FFFFFF" />
<stroke
android:width="4dp"
android:color="#18244D"
/>
<size
android:width="25dp"
android:height="25dp"
/>
</shape>
Ответ 23
В библиотеке компонентов материалов версии 1.2.0 вы можете использовать новый компонент Slider
.
<com.google.android.material.slider.Slider
android:valueFrom="0"
android:valueTo="300"
android:value="200"
android:theme="@style/slider_red"
/>
Вы можете переопределить цвет по умолчанию, используя что-то вроде:
<style name="slider_red">
<item name="colorPrimary">#......</item>
</style>
![enter image description here]()
В противном случае вы можете использовать эти атрибуты в макете для определения цвета или селектора цвета:
<com.google.android.material.slider.Slider
app:activeTrackColor="@color/...."
app:inactiveTrackColor="@color/...."
app:thumbColor="@color/...."
/>
или вы можете использовать собственный стиль:
<style name="customSlider" parent="Widget.MaterialComponents.Slider">
<item name="activeTrackColor">@color/....</item>
<item name="inactiveTrackColor">@color/....</item>
<item name="thumbColor">@color/....</item>
</style>
Ответ 24
Вы также можете сделать это следующим образом:
<SeekBar
android:id="@+id/redSeekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progressDrawable="@color/red"
android:maxHeight="3dip"/>
Надеюсь, это поможет!