В настоящее время я пытаюсь использовать класс CoordinatorLayout
для адаптации непрозрачности Toolbar
в зависимости от положения прокрутки ScrollView
. Я преуспеваю в том, чтобы «вручную привязать» два вида, прослушивая события прокрутки ScrollView
и сообщая им об альфа-значении моего фона Toolbar
.Изменение знака альфа-панели панели инструментов при прокрутке с помощью CoordinatorLayout
Требуемая поведение:
Панель инструментов начинается в прозрачной состоянии (оба текста и фона) и в конечном итоге полностью белый фон и черный текст когда один вид полностью прокручивается ,
Поведение примерно это: 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 к альфа-значению цвета фона панели инструментов.
Очевидно, что если вы знаете, как реализовать все это, я буду очень рад видеть ваш сниппет :)
Похоже, классная концепция приятная одна. –
Если вы ищете подробное объяснение координатор-вылетов, проверьте это. https://medium.com/google-developers/intercepting-everything-with-coordinatorlayout-behaviors-8c6adc140c26#.nvsysrem6 –