2

В настоящее время я пытаюсь использовать класс 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 к альфа-значению цвета фона панели инструментов.

Очевидно, что если вы знаете, как реализовать все это, я буду очень рад видеть ваш сниппет :)

+0

Похоже, классная концепция приятная одна. –

+1

Если вы ищете подробное объяснение координатор-вылетов, проверьте это. https://medium.com/google-developers/intercepting-everything-with-coordinatorlayout-behaviors-8c6adc140c26#.nvsysrem6 –

ответ

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 к значению альфа-значения цвета фона панели инструментов.

В вашем макете отсутствует CoordinatorLayout как главный родитель, который обертывает все. Вместо использования ScrollView вы должны использовать NestedScrollView это работает точно так же, как ScrollView, но разница в том, что NestedScrollView может выполнять вложенные свитки в старой версии, в отличие от ScrollView которые вложены свитки только после того, как API 23.

Для CoordinatorLayout.Behavior работать целевой вид должен быть прямым потомком CoordinatorLayout. Как вы можете видеть в статье, Toolbar является прямым потомком координатора. В противном случае поведение не будет работать.

В примере NestedScrollView есть поведение макета панели управления, так что AppBarLayout может расширяться и сворачиваться, вы можете найти множество примеров об этом.

+0

Пожалуйста, взгляните на этот вопрос https://stackoverflow.com/questions/45460263/toolbaralphascrollbehavior-coordinatorlayout –

Смежные вопросы