personalizar - Android: Appcompat 21 cómo agregar sombra en la barra de acción
personalizar navbar android studio (4)
Así es como muestro la sombra:
<!-- API level 21 and above then the elevation attribute is enough. For some reason it can''t be set directly on the include so I wrap it in a FrameLayout -->
<FrameLayout
android:id="@+id/topwrapper"
android:background="@color/theme_primary"
android:elevation="4dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/toolbar_actionbar" />
</FrameLayout>
<FrameLayout
android:layout_below="@id/topwrapper"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- This topshadow is hidden in code for API level 21 and above -->
<include layout="@layout/topshadow" />
</FrameLayout>
Y luego el diseño de la sombra superior se ve así (ajusta el 5dp para obtener la altura de la sombra que deseas):
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="5dp"
android:id="@+id/shadow_prelollipop"
android:background="@drawable/background_shadow" />
background_shadow.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#02444444"
android:endColor="#33111111"
android:angle="90"></gradient>
</shape>
toolbar_actionbar.xml
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res-auto"
myapp:theme="@style/ActionBarThemeOverlay"
myapp:popupTheme="@style/ActionBarPopupThemeOverlay"
android:id="@+id/toolbar_actionbar"
android:background="@color/theme_primary"
myapp:titleTextAppearance="@style/ActionBar.TitleText"
myapp:contentInsetStart="?actionBarInsetStart"
android:layout_width="match_parent"
android:layout_height="?actionBarSize" />
Agrego la nueva barra de acción de diseño de material de la nueva appcompat y uso el nuevo widget de la barra de herramientas. Puse un fondo personalizado en la barra de herramientas en xml pero mi problema es que no se muestra la sombra de la barra de acción. Sabes como hacer esto?
Código de la barra de herramientas
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_awesome_toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="@drawable/ab_background_textured"
app:theme="@style/MyTheme"
app:popupTheme="@style/MyTheme.Popup"/>
MyTheme estilo
<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
<item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
<item name="android:textColorSecondary">#ffff8800</item>
</style>
MyTheme.Popup estilo
<style name="MyTheme.Popup" parent="ThemeOverlay.AppCompat.Dark">
<item name="android:textColor">#ffffff</item>
</style>
Actualizar
Como @Justin Powell sugirió que agregue el actionBarStyle
de actionBarStyle
a mi tema, pero aún no hay sombra.
Estilo MyTheme (Actualizado)
<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
<item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
<item name="android:textColorSecondary">#ffff8800</item>
<item name="android:actionBarStyle">@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse</item>
</style>
Encontré que la solución en la aplicación Google IO es aceptable para mí, pero no vi ningún blog o publicación de que lo explicara completamente. Lo que puede hacer es tomar su activo sombra del cajón con licencia Apache 2 de https://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png y luego en El diseño de su actividad:
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent">
<include android:id="@+id/toolbar"
layout="@layout/toolbar"/>
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"
android:foreground="@drawable/header_shadow">
<!-- YOUR STUFF HERE -->
</FrameLayout>
</RelativeLayout>
Mientras que la sombra del encabezado es
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="header_shadow" type="drawable">@drawable/bottom_shadow</item>
</resources>
para niveles de API <21. Al igual que https://github.com/google/iosched/blob/master/android/src/main/res/values/refs.xml y https://github.com/google/iosched/blob/master/android/src/main/res/values-v21/refs.xml .
Y para ser más elaborado, aquí está la barra de herramientas.xml.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="4dp"
app:theme="@style/ToolbarTheme"
app:popupTheme="@style/AppTheme"/>
Para diseños pre-5.0, puede agregar la sombra al contenido debajo de la barra de herramientas agregando foreground="?android:windowContentOverlay"
al foreground="?android:windowContentOverlay"
del contenido.
Por ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="?android:windowContentOverlay"
/>
</LinearLayout>
actionbar_background.xml
<item>
<shape>
<solid android:color="@color/black" />
<corners android:radius="2dp" />
<gradient
android:startColor="@color/black"
android:centerColor="@color/black"
android:endColor="@color/white"
android:angle="270" />
</shape>
</item>
<item android:bottom="3dp" >
<shape>
<solid android:color="#ffffff" />
<corners android:radius="1dp" />
</shape>
</item>
</layer-list>
añadir al fondo actionbar_style
<style name="Theme.ActionBar" parent="style/Widget.AppCompat.Light.ActionBar.Solid">
<item name="background">@drawable/actionbar_background</item>
<item name="android:elevation">0dp</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:layout_marginBottom">5dp</item>
<item name="logo">@drawable/ab_logo</item>
<item name="displayOptions">useLogo|showHome|showTitle|showCustom</item>
</style>
añadir a Basetheme
<style name="BaseTheme" parent="Theme.AppCompat.Light">
<item name="android:homeAsUpIndicator">@drawable/home_back</item>
<item name="actionBarStyle">@style/TFKBTheme.ActionBar</item>
</style>