我目前正在尝试使用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值。
显然,如果您也知道如何实现这一切,我将很高兴看到您的代码:)
答案 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
可以展开和折叠,您可以找到大量关于此的示例。