studio sgoliver personalizar herramientas busqueda barra bar actionbar android seekbar custom-selectors

sgoliver - Android-Barra de búsqueda de estilo



sgoliver toolbar (21)

Quería diseñar una barra de búsqueda que se pareciera a la de la imagen de abajo.

Al usar la barra de búsqueda predeterminada obtendré algo como esto:

Entonces lo que necesito es solo cambiar el color. No necesito estilos extra. ¿Hay algún enfoque directo para hacer esto o debo construir mi dibujo personalizable?

Intenté crear una personalizada, pero no pude obtener la exacta como se muestra arriba. Después de usar dibujable personalizado, lo que obtengo es como se muestra a continuación:

Si necesito crear uno personalizado, sugiera cómo reducir el ancho de la línea de progreso y también la forma.

mi implementación personalizada:

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>

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

barra de busqueda:

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


Acaba de establecer

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

Eso es todo


Cambio el 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>

y el 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>

Para hacer el fondo y el progreso 1dp altura.


Como mencione uno arriba (@andrew), crear SeekBar personalizado es muy fácil con este sitio: http://android-holo-colors.com/

Simplemente habilita SeekBar allí, elige el color y recibe todos los recursos y copia en el proyecto. Luego aplícalos en xml, por ejemplo:

android:thumb="@drawable/apptheme_scrubber_control_selector_holo_light" android:progressDrawable="@drawable/apptheme_scrubber_progress_horizontal_holo_light"


Estilo de material personalizado de la barra de búsqueda de Android, para otras personalizaciones de la barra de búsqueda 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>


Extraería drawables y xml del código fuente de Android y cambiaría su color a rojo. Aquí está un ejemplo de cómo completé esto para mdpi drawables:

Custom red_scrubber_control.xml (agregar a 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>

Personalizado: 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>

Luego copie los elementos dibujables requeridos del código fuente de Android, tomé de este enlace

Es bueno copiar estos dibujables para cada hdpi, mdpi, xhdpi. Por ejemplo yo solo uso mdpi:

Luego, usando Photoshop, cambie el color de azul a rojo:

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:

Añadir SeekBar al diseño:

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

Resultado:



Mi respuesta está inspirada en Andras Balázs. La respuesta de Lajtha permite trabajar sin archivos xml.

seekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN); seekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);


Para aquellos que usan enlace de datos:

  1. Agrega el siguiente método estático a cualquier clase

    @BindingAdapter("app:thumbTintCompat") public static void setThumbTint(SeekBar seekBar, @ColorInt int color) { seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN); }

  2. Agregue el atributo app:thumbTintCompat a su 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}" />

Eso es. Ahora puedes usar app:thumbTintCompat con cualquier SeekBar . El tinte de progreso se puede configurar de la misma manera.

Nota: este método también es compatible con dispositivos pre-lollipop.


Pequeña corrección a la respuesta por @ arnav-rao:

Para asegurarse de que el pulgar esté coloreado correctamente, use:

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

aquí android: thumbTint en realidad colorea el "pulgar"


Por defecto, Android hará coincidir el color de progreso de su control deslizante para

`<item name="colorAccent">`

Valor en su styles.xml . Luego, para establecer una imagen de control deslizante personalizada, solo use este código en el bloque de diseño XML de su SeekBar :

android:thumb="@drawable/slider"


Quería crear un estilo para la barra de búsqueda y luego agregar el estilo a un tema para poder aplicarlo a un tema completo y al mismo tiempo permitir que un subestilo lo anule. Aquí esta lo que hice:

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

Lo anterior establece el estilo de la barra de búsqueda del tema en azul para todos los dispositivos 21+, incluido Samsung (que necesita el uso de seekBarStyle además de android: seekBarStyle; no estoy seguro de por qué pero vi este problema de primera mano). Si desea que todas las barras de búsqueda mantengan el estilo del tema y solo apliquen el estilo de la barra de búsqueda verde a algunos widgets, a continuación, agregue lo siguiente al widget que desee:

<SeekBar android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.Green"/>


Revisa este tutorial muy bueno.

https://www.lvguowei.me/post/customize-android-seekbar-color/

sencillo :

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

entonces un archivo de estilo:

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


Si desea exactamente la misma barra pero en rojo, puede agregar un filtro de color PorterDuff mediante programación. Puede obtener cada dibujo que desee colorear a través de los métodos de la clase base ProgressBar . A continuación, establezca un filtro de color para ello.

mySeekBar.getProgressDrawable().setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.MULTIPLY));

Si el ajuste de color deseado no se puede realizar a través de un filtro Porter Duff, puede especificar su propio filtro de color .


Si está utilizando SeekBar predeterminado proporcionado por Android Sdk, entonces es una forma sencilla de cambiar el color de eso. simplemente vaya a color.xml dentro de /res/values/colors.xml y cambie el colorAccent.

<resources> <color name="colorPrimary">#212121</color> <color name="colorPrimaryDark">#1e1d1d</color> <!-- change below line --> <color name="colorAccent">#FF4081</color> </resources>


Si miras los recursos de Android, la barra de búsqueda realmente usa imágenes.

Tiene que hacer un dibujo que sea transparente en la parte superior e inferior para, por ejemplo, 10 px y la línea central de 5 px está visible.

Consulte la imagen adjunta. Necesitas convertirlo en un NinePatch.


Solo reemplaza los atributos de color con tu color.

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>


También puedes hacerlo de esta manera:

<SeekBar android:id="@+id/redSeekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:progressDrawable="@color/red" android:maxHeight="3dip"/>

Espero que ayude!


Una forma sencilla de cambiar el color de la barra de búsqueda ...

<ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:theme="@style/Progress_color"/>

Estilo: Progress_color

<style name="Progress_color"> <item name="colorAccent">@color/white</item> <!-- Whatever color you want--> </style>

cambio de clase java ProgressDrawable ()

seek_bar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.MULTIPLY);


salida:

en el archivo de diseño:

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

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>

colores.xml

<color name="myPrimaryColor">#660033</color>


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

Funciona igual que la respuesta seleccionada. no es necesario crear ningún archivo dibujable o de lo contrario. (Solo en 5.0) Saludos


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