2015-08-11 2 views
7

У меня есть активность Android, которая использует CollapsingToolbarLayout внутри CoordinatorLayout для создания панели прокрутки/сгибания с изображением в качестве фона/баннера.Установить начальную высоту изображения параллакса в CollapsingToolbarLayout

Изображение загружается из Интернета, и я не знаю его размера заранее.

Сначала я хотел бы, чтобы панель инструментов была определенной высотой (160dp), но если изображение больше, чем это, я бы хотел, чтобы пользователь прокручивал вниз еще дальше, чтобы показать остальную часть изображения. Однако это никогда не должно происходить автоматически. Начальное состояние - 160dp, но пользователь должен иметь возможность прокручивать его вниз, чтобы увеличить высоту изображения.

Я не могу найти правильную комбинацию высоты/minheight для достижения этого. Это вообще возможно?

Вот мой макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:background="@color/toolbar_text"> 

    <android.support.design.widget.CoordinatorLayout 
      android:id="@+id/coordinatorLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true"> 

     <android.support.design.widget.AppBarLayout 
       android:id="@+id/appBarLayout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:fitsSystemWindows="true"> 

      <android.support.design.widget.CollapsingToolbarLayout 
        android:id="@+id/collapsing_toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        app:layout_scrollFlags="scroll|exitUntilCollapsed" 
        app:contentScrim="?attr/colorPrimary" 
        android:fitsSystemWindows="true"> 

       <!-- The background banner --> 
       <ImageView 
         android:id="@+id/imgBanner" 
         android:layout_width="match_parent" 
         android:layout_height="160dp" 
         android:scaleType="centerCrop" 
         android:fitsSystemWindows="true" 
         app:layout_collapseMode="parallax"/> 

       <android.support.v7.widget.Toolbar 
         android:id="@+id/toolbar" 
         android:layout_width="match_parent" 
         android:layout_height="?attr/actionBarSize" 
         app:layout_collapseMode="pin" 
         app:theme="@style/AppToolbarTheme" /> 

      </android.support.design.widget.CollapsingToolbarLayout> 

     </android.support.design.widget.AppBarLayout> 

     <android.support.v4.widget.NestedScrollView 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_gravity="fill_vertical" 
       android:clipToPadding="false" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior" > 

       ... 
     </android.support.v4.widget.NestedScrollView> 

    </android.support.design.widget.CoordinatorLayout> 

</LinearLayout> 

Высота баннера устанавливается в 160dp, который контролирует, насколько велика панель инструментов на начальном этапе, но, очевидно, таким образом, я не могу продлить его за 160dp, потому что это высота представления.

Я попытался установить 160dp высоту в CollapsingToolbarLayout или AppBarLayout, но ничего не помогает, это всегда максимальная 160dp в высоту, и я могу только пролистать его вверх (меньшее изображение), а не вниз, даже если изображение гораздо больше, и ImageView рассчитано на весы wrap_content.

Вот рисунок, что я хочу достичь в случае, если это не ясно: Mockup of what I want

+0

Я пытаюсь иметь то же самое. Вам удалось заставить это работать? –

ответ

4

Вот один Hacky способ сделать это, я не уверен, что лучшего способа, но хотелось бы услышать , Проверьте ControllableAppBarLayout

Место, что код в ваш проект и заменить:

android.support.design.widget.AppBarLayout 

С:

ControllableAppBarLayout 

Установите андроида: layout_height из ControllableAppBarLayout быть максимальный размер вашей панели инструментов, т.е. размер, который вы хотите в своем «прокрутке вниз».

Затем в коде в методе OnCreate(), вы можете получить доступ к ControllableAppBarLayout:

appBarLayout = (ControllableAppBarLayout) findViewById(R.id.appBarLayout); 
appBarLayout.collapseToolbar(); 

appBarLayout.collapseToolbar() будет полностью закрыть панель инструментов. Тем не менее, вы можете изменить этот метод в ControllableAppBarLayout:

private void performCollapsingWithoutAnimation() { 
    if (mParent.get() != null) { 
     mBehavior.onNestedPreScroll(mParent.get(), this, null, 0, getHeight(), new int[]{0, 0}); 
    } 
} 

В частности, изменить GetHeight() к числу в дп, представляющий собой разницу между максимальной высоты панели инструментов изображения и высоты вы хотите сначала показать. То есть разница между «начальным состоянием» и «прокруткой дальше вниз», как вы показали выше.

Этот хак должен выполнить то, что вы хотите.

+0

Ницца, отлично работает и еще не нашел побочных эффектов. Благодаря! –

+0

Я рад, что это сработало, это здорово. Пожалуйста. – Ethan

+1

Возможно, одна проблема: есть ли способ удостовериться, что «полностью расширенная» высота никогда не превышает доступное пространство экрана на устройстве? Например, если я установил высоту на 420dp, на моем устройстве у меня осталось некоторое пространство внизу. Но если у кого-то гораздо более короткое устройство, они могут прокручивать контент на всем экране (изображение занимает весь экран), а затем они больше не могут прокручивать резервные копии. То же самое, когда вы включаете устройство в альбомный режим. Я попытался применить нижний предел к ControllableAppBarLayout, но, похоже, ничего не делает. –

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