Андроид - стайлинг панели поиска
Я хотел создать панель поиска, которая выглядит как на изображении ниже.

С помощью панели поиска по умолчанию я получу что-то вроде этого:

так что мне нужно только изменить цвет. Мне не нужны дополнительные стили. Есть ли какой-либо прямой подход для этого, или я должен построить свой собственный drawable.?
Я попытался построить пользовательский, но я не мог получить точный, как показано выше.
После использования пользовательские drawable, что я получаю, как показано ниже:

если мне нужно построить пользовательский, то, пожалуйста, предложите, как уменьшить ширину линии прогресса, а также форму.
мои пользовательские реализации:
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>
прогресса.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>
большой палец.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>
21 ответов:
Я бы извлекал drawables и xml из исходного кода Android и менял его цвет на красный. Вот пример, как я завершил это для mdpi drawables:
Custom
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>Custom:
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, я взял по этой ссылке
хорошо скопировать эти чертежи для каждого hdpi, mdpi, xhdpi. Например, я использую только элемент:
затем с помощью Photoshop измените цвет с синего на красный:
red_scrubber_control_disabled_holo.формат PNG:
red_scrubber_control_focused_holo.формат PNG:
red_scrubber_control_normal_holo.формат PNG:
red_scrubber_control_pressed_holo.формат PNG:
red_scrubber_primary_holo.9.формат PNG:
red_scrubber_secondary_holo.9.формат PNG:
red_scrubber_track_holo_light.9.формат PNG:
добавить панель поиска макет:
<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" />результат:
Если вы хотите точно такую же панель, но в красном цвете, вы можете добавить цветной фильтр PorterDuff программно. Вы можете получить каждый из рисунков, который вы хотите раскрасить с помощью методов ProgressBar базовый класс. Затем установите цветовой фильтр для него.
mySeekBar.getProgressDrawable().setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.MULTIPLY));если требуемая регулировка цвета не может быть выполнена через фильтр Porter Duff, вы можете укажите свой собственный цветовой фильтр.
мой ответ вдохновлен ответом Андраса Баласа лайты это позволяет работать без XML-файла
seekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN); seekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
просто замените цветные атрибуты своим цветом
фон.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>прогресса.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>стиль.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>большой палец.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>
Google сделали это проще в SDK 21. Теперь у нас есть атрибуты для указания цветов оттенка большого пальца:
android:thumbTint android:thumbTintMode android:progressTinthttp://developer.android.com/reference/android/widget/AbsSeekBar.html#attr_android:thumbTint http://developer.android.com/reference/android/widget/AbsSeekBar.html#attr_android:thumbTintMode
Android seekbar пользовательский стиль материала, для других настроек seekbarhttp://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>
Как упоминалось выше (@andrew), создание пользовательской панели поиска очень легко с этим сайтом -http://android-holo-colors.com/
просто включите панель поиска там, выберите цвет и получите все ресурсы и скопируйте в проект. Затем примените их в xml, например:
android:thumb="@drawable/apptheme_scrubber_control_selector_holo_light" android:progressDrawable="@drawable/apptheme_scrubber_progress_horizontal_holo_light"
<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" />работает как же ответ выбран. нет необходимости делать какой-либо drawable файл или еще.(В 5.0 только) С уважением
по умолчанию android будет соответствовать цвету прогресса вашего слайдера до
`<item name="colorAccent">`стоимостью в стили.xml. Затем, чтобы установить пользовательский слайдер thumb image, просто используйте этот код в своем SeekBar XML-макета блок:
android:thumb="@drawable/slider"
Если вы используете панель поиска по умолчанию, предоставленную Android Sdk, то их простой способ изменить цвет этого . просто перейти к цвету.xml внутри / res / значения / цвета.xml и изменить colorAccent.
<resources> <color name="colorPrimary">#212121</color> <color name="colorPrimaryDark">#1e1d1d</color> <!-- change below line --> <color name="colorAccent">#FF4081</color> </resources>
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);
изменить
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высота.
Если вы посмотрите на ресурсы Android, панель поиска фактически использует изображения.
вы должны сделать drawable, который прозрачен сверху и снизу, например, 10px, а центральная линия 5px видна.
см. прикрепленные изображения. Вам нужно преобразовать его в NinePatch.
простой способ изменить цвет строки поиска ...
<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 class change ProgressDrawable ()
seek_bar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.MULTIPLY);
выход:
в файл макета:
<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" />drawable / прогресс.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>drawable/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>drawable / 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>drawable / 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>цвета.xml
<color name="myPrimaryColor">#660033</color>
для тех, кто использует привязку данных:
добавьте следующий статический метод в любой класс
@BindingAdapter("app:thumbTintCompat") public static void setThumbTint(SeekBar seekBar, @ColorInt int color) { seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN); }добавить
app:thumbTintCompatатрибут вашей панели поиска<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. Оттенок хода выполнения можно настроить таким же образом.Примечание: этот метод также совместим с устройствами pre-lollipop.
небольшая поправка к ответу @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 фактически окрашивает "большой палец"
проверьте этот учебник очень хорошо
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"/>затем файл style:
<?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>
вы также можете сделать это таким образом :
<SeekBar android:id="@+id/redSeekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:progressDrawable="@color/red" android:maxHeight="3dip"/>надеюсь, что это поможет!











Comments