hapus bayangan di bawah widget AppBarLayout android


94

Saat menggunakan AppBarLayoutwidget di pustaka dukungan desain, bayangan muncul di bagian bawah toolbar. Bagaimana cara menghapus bayangan itu?

Jawaban:


233

Cukup gunakan app:elevation="0dp"di dalam "AppBarLayout" untuk menghapus bayangan. Itu selalu berhasil untuk saya. Semoga berhasil untuk Anda.


64
Jangan gunakan android: elevasi. Gunakan aplikasi: ketinggian.
radley

4
Apakah ada cara untuk melakukannya secara terprogram tanpa mendapatkan peringatan bahwa pengaturan ketinggian hanya tersedia setelah L?
davidcv5

2
app: elevation = "0dp", bayangan dihapus, tetapi sekarang tab tidak dapat diklik.
Sandeep P

8
Menyetelnya ke 0dp menyembunyikan Toolbar.
Shajeel Afzal

1
Sayangnya tidak ada lagi jawaban yang berhasil. Lihat jawaban Liu Teng di bawah ini dengansetOutlineProvider
Matthew

49

masalah ini hanya terjadi ketika api versi> = 21, jika Anda tidak ingin mengubah ketinggian, Anda dapat menggunakan:

appBar.setOutlineProvider(null);

ingatlah untuk memeriksa versi api


EDIT:

Pukulan adalah kode sumber setOutlineProvider.

   /**
     * Sets the {@link ViewOutlineProvider} of the view, which generates the Outline that defines
     * the shape of the shadow it casts, and enables outline clipping.
     * <p>
     * The default ViewOutlineProvider, {@link ViewOutlineProvider#BACKGROUND}, queries the Outline
     * from the View's background drawable, via {@link Drawable#getOutline(Outline)}. Changing the
     * outline provider with this method allows this behavior to be overridden.
     * <p>
     * If the ViewOutlineProvider is null, if querying it for an outline returns false,
     * or if the produced Outline is {@link Outline#isEmpty()}, shadows will not be cast.
     * <p>
     * Only outlines that return true from {@link Outline#canClip()} may be used for clipping.
     *
     * @see #setClipToOutline(boolean)
     * @see #getClipToOutline()
     * @see #getOutlineProvider()
     */
    public void setOutlineProvider(ViewOutlineProvider provider) {
        mOutlineProvider = provider;
        invalidateOutline();
    }

Dikatakan bahwa If the ViewOutlineProvider is null, if querying it for an outline returns false, or if the produced Outline is {@link Outline#isEmpty()}, shadows will not be cast.

Jadi, jika Anda ingin menghapus bayangan, sebaiknya Anda menggunakan metode ini daripada pengaturan app:elevation. Tampaknya mengubah ketinggian untuk menghilangkan bayangan adalah semacam efek samping. Dan mengubah ketinggian dapat menyebabkan beberapa masalah lain dalam beberapa kasus.


API hanya tersedia dari versi 21.
chakrapani

Apa yang harus dilakukan dengan API <21?
DYS

masalah ini hanya terjadi ketika api> = 21
Liu Teng

9

Untuk semua yang tidak ingin menggunakan bringToFront()dan elevation="0dp"membuat bilah alat menghilang:

app:elevation="0dp"disisir dengan android:translationZ="0.1dp"bekerja untuk saya.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp"
    android:translationZ="0.1dp"
    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@null"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.AppBarLayout>

8

Dengan versi appcompat terbaru, setelan trik app:elevation="0.1dp"di xml tidak berfungsi lagi.

Sejauh ini saya telah menemukan dua solusi.

  1. Alih-alih menyetel app:elevation, coba gunakan stateListAnimator. Misalnya dalam kode:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        StateListAnimator stateListAnimator = new StateListAnimator();
        stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(appBarLayout, "elevation", 0.1f));
        appBarLayout.setStateListAnimator(stateListAnimator);
    }
  2. Cara yang lebih mudah adalah Anda tetap mengatur app:elevation="0dp"xml seperti biasa, tetapi dalam kode:

    appBarLayout.bringToFront();

Penghargaan diberikan untuk dua diskusi ini:

ToolBar menghilang saat menyetel ketinggian untuk AppBarLayout

ketika mengatur app: elevation = "0dp" maka hamburgermenu tidak muncul ke toolbar


3

Gunakan android:stateListAnimator="@null". Tidak ada efek samping.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:stateListAnimator="@null"
    >

2

Saya mencoba app:elevation="0dp"tetapi bilah alat hilang, tetapi menggunakan app:elevation="0.1dp"membuat trik.

Semoga ini bisa membantu orang lain.


0.1dp juga tidak berfungsi, Ini juga menyembunyikan Menu Toolbar.
Shajeel Afzal

Saya memiliki aplikasi yang berfungsi dengan appcompat v23.0.1 menggunakan tip ini, versi apa yang Anda miliki?
Gueorgui Obregon

Saya menggunakan v25.0.0.
Shajeel Afzal

2
Sepertinya tidak berfungsi lagi dengan versi yang diperbarui :(.
Gueorgui Obregon

2

Tambahkan app: elevation = "0dp" di AppBarLayout Anda. seperti contoh ini

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

Jawaban penyelamat hidup :)
pengguna2672052

1

Secara terprogram Anda dapat menggunakan ini: getSupportActionBar (). SetElevation (0.0f);


0

Ini adalah cara yang saya app:elevation="0dp"pikirkan untuk menghilangkan bayangan. Bekerja dengan sempurna.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.