AppBarLayout widget'ının altındaki gölgeyi kaldır android


98

AppBarLayoutTasarım destek kitaplığında pencere öğesi kullanılırken , araç çubuğunun altında bir gölge belirir. Bu gölgeyi nasıl kaldırabilirim?

Yanıtlar:


242

app:elevation="0dp"Gölgeyi kaldırmak için "AppBarLayout" içinde kullanın . Benim için her zaman çalıştı. Umarım sizin için çalışır.


71
Android: elevation kullanmayın. Uygulamayı kullan: yükseklik.
radley

4
Yükseklik ayarının yalnızca L'den sonra kullanılabileceği uyarısını almadan programlı olarak yapmanın bir yolu var mı?
davidcv5

2
app: elevation = "0dp", gölge kaldırıldı, ancak artık sekmeler tıklanabilir değil.
Sandeep P

8
0dp olarak ayarlamak Araç Çubuğunu gizler.
Shajeel Afzal

1
Maalesef artık geçerli bir cevap değil. Aşağıdaki Liu Teng'in cevabına bakınsetOutlineProvider
Matthew

49

bu sorun yalnızca api sürümü> = 21 olduğunda ortaya çıkar , yüksekliği değiştirmek istemiyorsanız şunu kullanabilirsiniz:

appBar.setOutlineProvider(null);

api sürümünü kontrol etmeyi unutmayın


DÜZENLE :

Blow, kaynak kodudur 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();
    }

Şöyle söylenir 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.

Bu nedenle, gölgeyi kaldırmak istiyorsanız , ayarlamak yerine bu yöntemi kullanmalısınız app:elevation. Gölgeyi kaldırmak için yüksekliği değiştirmenin bir tür yan etki olduğu görülüyor. Ve yüksekliğin değiştirilmesi bazı durumlarda başka sorunlara neden olabilir.


API yalnızca 21 sürümünden itibaren mevcuttur.
chakrapani

API <21 ile ne yapılmalı?
DYS

bu sorunlar sadece api> = 21 olduğunda ortaya çıkar
Liu Teng

9

Araç çubuğunu kullanmak istemeyen bringToFront()ve elevation="0dp"kaybolan herkes için :

app:elevation="0dp"ile taranmış android:translationZ="0.1dp"benim için çalıştı.

<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

En yeni appcompat sürümleriyle, xml'deki hile ayarı app:elevation="0.1dp"artık çalışmıyor.

Şimdiye kadar iki çözüm buldum.

  1. Ayarlamak yerine app:elevationbir stateListAnimator kullanmayı deneyin. Örneğin, kodda:

    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. Daha kolay bir yol, app:elevation="0dp"xml'de normal olarak ayarlamanızdır , ancak kodda:

    appBarLayout.bringToFront();
    

Kredi şu iki tartışmaya gider:

AppBarLayout için yükseklik ayarlarken ToolBar kayboluyor

uygulama ayarlandığında: elevation = "0dp" ve ardından hamburgermenu araç çubuğunda gösterilmiyor


3

Kullanın android:stateListAnimator="@null". Yan etki yok.

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

2

Denedim app:elevation="0dp"ama araç çubuğu kayboldu, ancak kullanmak app:elevation="0.1dp"hile yaptı.

Umarım bu başka birine yardımcı olur.


0.1dp de çalışmıyor, Araç Çubuğu Menüsünü de gizliyor.
Shajeel Afzal

Bu ipuçlarını kullanan appcompat v23.0.1 ile çalışan bir uygulamam var, hangi sürüme sahipsiniz?
Gueorgui Obregon

Ben kullanıyorum v25.0.0.
Shajeel Afzal

2
Görünüşe göre güncellenmiş sürümlerle artık çalışmıyor :(.
Gueorgui Obregon

2

AppBarLayout'unuza app: elevation = "0dp" ekleyin. bu örnek gibi

<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>

Hayat kurtaran cevap :)
user2672052

1

Programlı olarak şunu kullanabilirsiniz: getSupportActionBar (). SetElevation (0.0f);


0

app:elevation="0dp"Gölgeyi kaldırmak için bulduğum yol bu . Mükemmel çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.