【问题标题】:Changing toolbar background alpha value when scrolling with CoordinatorLayout使用 CoordinatorLayout 滚动时更改工具栏背景 alpha 值
【发布时间】:2016-08-11 18:24:54
【问题描述】:

我目前正在尝试使用CoordinatorLayout 类根据ScrollView 滚动位置调整Toolbar 不透明度。我成功地“手动链接”了这两个视图,监听了 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;
    }
}

问题

然而,即使之前的 sn-ps 是一个特别简单的解决方案,似乎可以完美运行,我只是有点困惑为什么它不能与 CoordinatorLayout 一起使用。另外,我发现一个人似乎通过自定义 CoordinatorLayout.Behavior&lt;android.support.v7.widget.Toolbar&gt; 实现成功地完成了这项任务。

你可以看看他的custom CoordinatorLayout.Behavior implementation。他还提供了有关Medium 的一些详细信息。然而,由于很多只是&lt;android.support.v7.widget.Toolbar .../&gt; 而不是完整的Toolbar 标签,并且对支持设计库的这部分工作原理缺乏了解,我永远无法实现它......

问题

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

显然,如果你也知道如何实现这一切,我会很高兴看到你的 sn-p :)

【问题讨论】:

  • 它看起来像一个很酷的概念不错的兄弟
  • 如果您正在寻找 coordinatorlayouts 的详细说明,请查看此内容。 medium.com/google-developers/…

标签: android android-scrollview android-coordinatorlayout androiddesignsupport


【解决方案1】:

我一直在尝试各种行为,很高兴您发现我的文章对您有所帮助。

我编辑了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 具有应用栏布局行为,因此AppBarLayout 可以展开和折叠,您可以找到很多关于此的示例。

【讨论】:

猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2017-12-27
  • 1970-01-01
相关资源
最近更新 更多