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.