在工具栏上应用渐变背景

Applying a gradient background on a toolbar

我创建了一个自定义渐变可绘制文件,我想将其用作 Toolbar 的背景,但我似乎无法应用它。它只是显示为纯灰色(见图片)。难道我做错了什么?我查看了多个帖子,但到目前为止没有任何效果。

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">

    <Toolbar
        android:id="@+id/home_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/home_toolbar_gradient"
        android:elevation="4dp"
        android:minHeight="70dp"
        android:theme="@style/customToolbar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

        <TextView
            android:id="@+id/title_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:fontFamily="@font/Montserrat-Bold"
            android:gravity="center"
            android:text="@string/home"
            android:textAlignment="center"
            android:textColor="@android:color/white" />
    </Toolbar>

    <!-- Using a view with a gradient to create a drop navbar_shadow effect for the navbar -->
    <View
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:layout_above="@id/bottom_nav_bar"
        android:background="@drawable/navbar_shadow" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        app:labelVisibilityMode="labeled"
        android:id="@+id/bottom_nav_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:itemBackground="@android:color/white"
        app:itemIconTint="@drawable/nav_selected_item_color"
        app:itemTextColor="@drawable/nav_selected_item_color"
        app:menu="@menu/bottom_nav_bar">


    </com.google.android.material.bottomnavigation.BottomNavigationView>

</RelativeLayout>

home_toolbar_gradient.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:type="linear"
        android:startColor="@color/toolbar_starting_color"
        android:endColor="@color/toolbar_ending_color"
        android:angle="75" />
</shape>

styles.xml:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:fontFamily">@font/montserrat_medium</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <!-- Custom Rounded Dialog style -->
    <style name="RoundedDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="android:windowBackground">@drawable/rounded_corners</item>
    </style>

    <style name="customToolbar" parent="Theme.AppCompat.Light.NoActionBar" />

</resources>

在MainActivity.java中:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Toolbar homeToolbar = findViewById(R.id.home_toolbar);

setSupportActionBar(homeToolbar);

并在清单中:

android:theme="@style/Theme.AppCompat.Light.DarkActionBar"

尝试动态地进行:

setSupportActionBar(homeToolbar);
ActionBar actionbar = getSupportActionBar();
actionbar.setBackgroundDrawable(getResources().getDrawable(R.drawable.home_toolbar_gradient));

阅读this。它说-渐变的角度,仅用于线性渐变。必须是 [0, 315] 范围内 45 的倍数。

因此,将 home_toolbar_gradient.xml 可绘制对象更改为

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <gradient
    android:type="linear"
    android:startColor="#FF33"
    android:endColor="#AFF"
    android:angle="45" />
</shape>

试试这个:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

    <gradient
        android:angle="90"
        android:centerColor="#555994"
        android:endColor="#b5b6d2"
        android:startColor="#555994"
        android:type="linear" />

    <corners 
        android:radius="0dp"/>

</shape>

对于任何感兴趣的人,我实际上发现了这个问题。 gradient 可绘制对象中的 angle 属性必须是 45 的倍数,否则布局预览中会出现细微的渲染错误。只需将其更改为适合您需要的倍数,渐变就会生效。