ลบเงาด้านล่างวิดเจ็ต AppBarLayout android


98

เมื่อใช้AppBarLayoutวิดเจ็ตในไลบรารีสนับสนุนการออกแบบเงาจะปรากฏที่ด้านล่างของแถบเครื่องมือ ฉันจะลบเงานั้นได้อย่างไร?

คำตอบ:


242

เพียงใช้app:elevation="0dp"ภายใน "AppBarLayout" เพื่อลบเงา มันได้ผลสำหรับฉันเสมอ หวังว่ามันจะเหมาะกับคุณ


71
อย่าใช้ android: ระดับความสูง ใช้แอพ: ระดับความสูง
radley

4
มีวิธีดำเนินการตามโปรแกรมโดยไม่ได้รับคำเตือนว่าการตั้งค่าระดับความสูงจะใช้ได้เฉพาะหลังจาก L
davidcv5

2
แอป: ความสูง = "0dp" สีจะถูกลบออก แต่ตอนนี้ไม่สามารถคลิกแท็บ
Sandeep P

8
การตั้งค่าเป็น 0dp เป็นการซ่อน Toolbar
Shajeel Afzal

1
น่าเสียดายที่ไม่มีคำตอบที่ใช้ได้อีกต่อไป ดูคำตอบของ Liu Teng ด้านล่างกับsetOutlineProvider
Matthew

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 จะไม่ทำงานอีกต่อไป

จนถึงตอนนี้ฉันพบวิธีแก้ปัญหาสองวิธี

  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();
    

เครดิตไปที่การสนทนาทั้งสองนี้:

ToolBar จะหายไปเมื่อตั้งค่าระดับความสูงสำหรับ AppBarLayout

เมื่อตั้งค่าแอป: ความสูง = "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

ฉันมีแอปที่ใช้งานได้กับ appcompat v23.0.1 โดยใช้เคล็ดลับนี้คุณมีเวอร์ชันใด
Gueorgui Obregon

ฉันใช้v25.0.0.
Shajeel Afzal

2
ดูเหมือนว่าจะใช้งานไม่ได้อีกต่อไปกับเวอร์ชันที่อัปเดตแล้ว :(
Gueorgui Obregon

2

เพิ่มแอป: ระดับความสูง = "0dp" บน AppBarLayout ของคุณ เช่นตัวอย่างนี้

<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


0

นี่คือวิธีที่ฉันคิดขึ้นapp:elevation="0dp"เพื่อลบเงาใช้งานได้อย่างสมบูรณ์แบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.