Android折叠工具栏移除高程和阴影

时间:2018-04-05 03:17:17

标签: android android-layout

我正在尝试在折叠应用栏中创建一个渐变的布局,这是一种纯色。这应该可以通过app:elevation="0dp"来实现,但这没有奏效。但是,当我在我的应用程序上运行“即时运行”时,而不是运行完整版本,我得到了所需的结果。让我包括图片:

以下是目前的情况: 带投影的UI,不良结果

enter image description here

以下是我运行即时运行时所需的外观/显示内容: 没有投影的UI,所需的结果

enter image description here

这是我的布局文件:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:windowActionBar="false"
android:id="@+id/main_background">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/app_bar_height"
    android:fitsSystemWindows="true"
    android:theme="@style/AppTheme"
    android:elevation="0dp"
    app:elevation="0dp">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:toolbarId="@+id/toolbar"
        android:elevation="0dp"
        app:elevation="0dp">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin">

        </android.support.v7.widget.Toolbar>

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

</recycler>

如果不清楚,我指的是app_bar下面标有“Reee”的阴影。在第一张图片中,有一个阴影,在第二张图片中没有阴影。我不想拥有影子。但是,当我运行即时运行时,我只能实现这种外观,然后在下次运行/完全编译时消失。

我仍然在寻找解决这个问题的方法,而且我还没有找到任何东西。我尝试过将stateListAnimator=@null设置为无效的示例。

好了做进一步的研究,我在这个appbar下面有一个带有Recyclerview的SwipeRefreshLayout。当我删除RecyclerView时,我得到了预期的效果。我的RecyclerView可以做什么,我该如何解决?

6 个答案:

答案 0 :(得分:5)

只需设置

android:stateListAnimator="@null"

app:elevation="0dp"

注意:,您应该使用 app:命名空间,而不是 android:

到您的AppBarLayout

答案 1 :(得分:4)

您可以通过设置自定义stateListAnimator

来完成此操作

animator下的res中创建一个新动画“appbar_not_elevated.xml”。

<item app:state_collapsible="true" app:state_collapsed="true">
    <objectAnimator android:propertyName="elevation"
                    android:valueTo="0"
                    android:valueType="floatType"
                    android:duration="1"/>
</item>

<item>
    <objectAnimator android:propertyName="elevation"
                    android:valueTo="0"
                    android:valueType="floatType"
                    android:duration="1"/>
</item>

这会将折叠的高程以及展开的状态高程设置为零。

然后将stateListAnimator设置为AppBarLayout

android:stateListAnimator="@animator/appbar_not_elevated"

答案 2 :(得分:1)

根据所使用的支持库,如果您阅读了设置应用栏高程的源代码,请阅读:

/**
 * @deprecated target elevation is now deprecated. AppBarLayout's elevation is now
 * controlled via a {@link android.animation.StateListAnimator}. If a target
 * elevation is set, either by this method or the {@code app:elevation} attribute,
 * a new state list animator is created which uses the given {@code elevation} value.
 *
 * @attr ref android.support.design.R.styleable#AppBarLayout_elevation
 */

告诉您,要么使用 app:elevation ,要么使用状态列表动画。对于第二个选项,将xml选择器添加到文件夹 animator-v21 中,然后将其设置为以下内容:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <objectAnimator android:duration="1"
                    android:propertyName="elevation"
                    android:valueTo="0dp"
                    android:valueType="floatType"/>
</item>

然后从xml中的应用栏中引用它:

android:stateListAnimator="@animator/my_appbar_state_list_animator"

答案 3 :(得分:1)

我忽略了最初提供我在AppBar下的RecyclerView问题,认为问题只是AppBarLayout。但我已经解决了这个问题。我的RecyclerView看起来像这样:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="0dp"
    android:background="@drawable/gradient_blue_4"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/transactions"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:clipToPadding="false"
        android:fadeScrollbars="true"
        android:overScrollMode="always"
        android:paddingBottom="48dp"
        android:scrollbars="none"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:background="?selectableItemBackground" />

</android.support.v4.widget.SwipeRefreshLayout>

AppBarLayout下方。不完全确定为什么这会解决问题,但删除?selectableItemBackground作为RecyclerView的背景可以解决问题并为我留下所需的结果。

感谢所有提供的答案,我原本更感兴趣,因为我通过运行即时运行获得了我想要的结果。不幸的是,这种见解没有提供额外的帮助

答案 4 :(得分:0)

将AppBarLayout的海拔高度和translationZ设置为零

appBarLayout.translationZ = 0f
appBarLayout.elevation = 0f

答案 5 :(得分:-3)

在你的java文件..

为您的应用栏设置变量,并使用findViewById(R.id.whatever

传递设置ID

然后使用

void setShadowEnabled (boolean enabled)

禁用阴影。

希望这会有所帮助......