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:
Google ha hecho esto más fácil en el SDK 21. Ahora tenemos atributos para especificar los colores del tinte del pulgar:
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
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:
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); }
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);