Андроид - стайлинг панели поиска



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



enter image description here



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



enter image description here



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



Я попытался построить пользовательский, но я не мог получить точный, как показано выше.
После использования пользовательские drawable, что я получаю, как показано ниже:



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>


прогресса.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>
624   21  

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_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
    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

Если вы хотите точно такую же панель, но в красном цвете, вы можете добавить цветной фильтр 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: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

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>

seekbar custom material 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"

просто набор

android:maxHeight="3dp"
android:minHeight="3dp"

вот и все

<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.

enter image description here

простой способ изменить цвет строки поиска ...

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

выход:

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" />

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>

для тех, кто использует привязку данных:

  1. добавьте следующий статический метод в любой класс

    @BindingAdapter("app:thumbTintCompat")
    public static void setThumbTint(SeekBar seekBar, @ColorInt int color) {
        seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
    
  2. добавить 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

  1. ทางเข้าสล็อต
    ทางเข้าสล็อต 3 года назад
    <p>Numerous thanks for a further excellent write-up. The position else could any one get that kind of details in these a wonderful means of composing? Individually, my looking to discover has completed now.</p>