AppBarLayoutウィジェットの下の影を削除するAndroid


94

AppBarLayoutデザインサポートライブラリでウィジェットを使用すると、ツールバーの下部に影が表示されます。どうすればその影を取り除くことができますか?

回答:


232

app:elevation="0dp"シャドウを削除するには、「AppBarLayout」の内部を使用するだけです。それはいつも私のために働いてきました。それがあなたのために働くことを願っています。


62
android:elevationは使用しないでください。app:elevationを使用します。
ラドリー2016年

3
標高の設定はLの後でしか使用できないという警告を受けずに、プログラムでそれを行う方法はありますか?
davidcv5 2016年

2
app:elevation = "0dp"、シェードは削除されましたが、タブはクリックできなくなりました。
Sandeep P

8
0dpに設定すると、ツールバーが非表示になります。
Shajeel Afzal 2017

1
残念ながら、もはや有効な答えではありません。以下のLiu Tengの回答を参照してくださいsetOutlineProvider
マシュー

49

この問題は、APIバージョンが21以上の場合にのみ発生します。標高を変更したくない場合は、以下を使用できます。

appBar.setOutlineProvider(null);

APIバージョンを確認することを忘れないでください


編集:

Blowはのソースコードです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();
    }

と言われている 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.

したがって、影を削除したい場合は、を設定する代わりにこのメソッドを使用app:elevationすることをお勧めします標高を変更して影を取り除くことは、一種の副作用のようです。また、標高を変更すると、場合によっては他の問題が発生することがあります。


APIは、バージョン21から提供されています
chakrapani

API <21で何をすべきか?
DYS

この問題は、api> = 21の場合にのみ発生します
Liu Teng

9

使用bringToFront()したくないelevation="0dp"、ツールバーを非表示にするすべての人のために:

app:elevation="0dp"と組み合わせてandroid:translationZ="0.1dp"働いた。

<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

最新のappcompatバージョンではapp:elevation="0.1dp"、xml のトリック設定は機能しなくなります。

これまでに2つの解決策を見つけました。

  1. を設定する代わりにapp:elevation、stateListAnimatorを使用してみてください。たとえば、コードでは:

    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. より簡単な方法はapp:elevation="0dp"、通常どおりxmlで設定しますが、コードでは次のようになります。

    appBarLayout.bringToFront();

クレジットはこれらの2つの議論に行きます:

AppBarLayoutの高度を設定するとToolBarが消える

app:elevation = "0dp"を設定すると、ハンバーガーメニューがツールバーに表示されない


3

を使用しandroid:stateListAnimator="@null"ます。副作用はありません。

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

2

試しましたapp:elevation="0dp"が、ツールバーは消えてしまいましたが、app:elevation="0.1dp"ました。

これが誰かを助けることを願っています。


0.1dpも機能せず、ツールバーメニューも非表示になっています。
Shajeel Afzal 2017

このヒントを使用してappcompat v23.0.1で動作するアプリがありますが、どのバージョンを使用していますか?
Gueorgui Obregon 2017

使用していv25.0.0ます。
Shajeel Afzal 2017

2
更新されたバージョンではもう動作しないようです:(
。– Gueorgui Obregon 2017

2

AppBarLayoutにapp:elevation = "0dp"を追加します。この例のように

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

命を救う答え:)
user2672052

1

プログラムでこれを使用できます:getSupportActionBar()。setElevation(0.0f);


0

これは私がapp:elevation="0dp"影を取り除くために思いついた方法です。完全に動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.