使用CoordinatorLayout滚动时更改工具栏背景alpha值

时间:2016-08-11 18:24:54

标签: android android-scrollview android-coordinatorlayout androiddesignsupport

我目前正在尝试使用CoordinatorLayout类根据Toolbar滚动位置调整ScrollView不透明度。我成功做到这一点"手动链接"这两个视图,听取ScrollView滚动事件并报告我Toolbar背景的alpha值。

想要的行为是:

  

工具栏以透明状态(文字和背景)开始,当一个视图结束时,完全白色背景黑色文字完全滚动。

行为大致是这样的:Youtube video

当前实施

布局文件(简化)

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <my.package.widgets.DetailsTop
                android:id="@+id/layout_details_top"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <my.package.widgets.DetailsBottom
                android:id="@+id/layout_details_bottom"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </ScrollView>

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#00FFFFFF"/>
</RelativeLayout>

片段实施

public class SearchVehicleDetailsFragment extends BaseFragment<SearchContract.ParentView> {

    @Bind(R.id.layout_details_top) DetailsTop detailsTopLayout;
    @Bind(R.id.layout_details_bottom) DetailsBottom detailsBottomLayout;
    @Bind(R.id.scrollView) ScrollView scrollView;
    @Bind(R.id.toolbar) Toolbar toolbar;

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                float alpha = (float) scrollView.getScrollY() / vehicleDetailsTopLayout.getHeight();
                toolbar.setBackgroundColor(getColorWithAlpha(alpha, getResources().getColor(R.color.white)));
                toolbar.setTitleTextColor(getColorWithAlpha(alpha, getResources().getColor(R.color.dark_grey)));
            }
        });
    }

    public static int getColorWithAlpha(float alpha, int baseColor) {
        int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;
        int rgb = 0x00ffffff & baseColor;
        return a + rgb;
    }
}

问题

然而,即使之前的代码片段是一个看似完美的特别简单的解决方案,但我对它为什么不能与CoordinatorLayout合作感到有些困惑。另外,我找到了一个似乎已经通过自定义CoordinatorLayout.Behavior<android.support.v7.widget.Toolbar>实现在此任务上取得成功的人。

你可以看看他的custom CoordinatorLayout.Behavior implementation。他还提供了Medium的一些细节。但是,由于很多<android.support.v7.widget.Toolbar .../>而不是完整的Toolbar标记以及对支持设计库的这一部分如何工作的强烈缺乏理解,我从未能够实现它...

问题

我想了解CoordinatorLayout及其周围的所有类是如何协同工作的。所以我可能能够实现我正在寻找的行为,即:将ScrollView滚动位置链接到工具栏背景颜色的alpha值。

显然,如果您也知道如何实现这一切,我将很高兴看到您的代码:)

1 个答案:

答案 0 :(得分:0)

我一直在尝试行为,我很高兴您发现我的文章部分有用。

我编辑了Toolbar块的代码,因为它并不重要。简单的Toolbar属性,没有什么特别之处:

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

我想了解CoordinatorLayout和所有类   在它周围,一起工作。所以我可能会实现   我正在寻找的行为,即:链接ScrollView滚动   位置到工具栏背景颜色的alpha值。

在您的布局中,您错过了CoordinatorLayout作为包装所有内容的顶级父级。不应使用ScrollView,而应使用NestedScrollView,它的工作方式与ScrollView类似,但区别在于NestedScrollView可以在旧版本中执行嵌套滚动,与ScrollView不同仅在API 23之后嵌套滚动。

要使CoordinatorLayout.Behavior工作 ,目标视图必须是CoordinatorLayout 的直接后代。正如您在文章中看到的那样,Toolbar是协调员的直接后代。否则,该行为将无效。

在示例NestedScrollView中有appbar布局行为,以便AppBarLayout可以展开和折叠,您可以找到大量关于此的示例。