2015-08-11 20 views
7

Mam aktywność Androida, która używa CollapsingToolbarLayout wewnątrz CoordinatorLayout, aby uzyskać przewijanie/zwijanie paska narzędzi z obrazem jako tłem/banerem.Ustaw początkową wysokość obrazu paralaksy w CollapsingToolbarLayout

Obraz jest ładowany z internetu i nie znam jego wcześniejszej wielkości.

Początkowo chciałbym, aby pasek narzędzi miał określoną wysokość (160dp), ale jeśli obraz jest większy niż ten, chciałbym wtedy pozwolić użytkownikowi przewinąć jeszcze bardziej, aby odsłonić resztę obrazu. Jednak nie powinno to nigdy nastąpić automatycznie. Stan początkowy wynosi 160 dp, ale użytkownik powinien móc przewinąć go w dół, aby jeszcze bardziej zwiększyć wysokość obrazu.

Nie mogę znaleźć odpowiedniej kombinacji wysokości/minogi, aby to osiągnąć. Czy to w ogóle możliwe?

Oto mój plan:

<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> 

Wysokość banera obrazu jest ustawiona na 160dp który kontroluje jak duża pasek narzędzi jest początkowo, ale oczywiście ten sposób nie mogę przedłużyć go poza 160dp ponieważ jest to wysokość widoku.

Próbowałem ustawić wysokość 160dp na CollapsingToolbarLayout lub AppBarLayout, ale nic nie pomaga, zawsze jest to maksymalna wysokość 160dp i mogę tylko przewijać go w górę (mniejszy obraz), a nie w dół, nawet jeśli obraz jest znacznie większy i Domyślna wartość to wrap_content.

Oto rysunek co chcę osiągnąć w przypadku, gdy nie jest jasne: Mockup of what I want

+0

Próbuję mieć dokładnie to samo. Czy udało Ci się to sprawić? –

Odpowiedz

4

Oto jeden hacky drogą do osiągnięcia tego, nie jestem pewien lepszy sposób, ale chciałbym to usłyszeć . Sprawdź ControllableAppBarLayout

miejsce, które kodu w projekcie i zastąpić:

android.support.design.widget.AppBarLayout 

Z:

ControllableAppBarLayout 

Ustaw android: layout_height z ControllableAppBarLayout być maksymalny rozmiar swojego paska narzędzi, tj rozmiar, który chcesz uzyskać w obrazku "przewijanie w dół".

Następnie w kodzie w metodzie onCreate(), można uzyskać dostęp do ControllableAppBarLayout:

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

appBarLayout.collapseToolbar() będzie całkowicie zamknąć pasek. Można jednak zmodyfikować tę metodę w ControllableAppBarLayout:

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

konkretnie zmienić getHeight() do liczby w dp stanowiącej różnicę pomiędzy max wysokość obrazu na pasku narzędzi i wysokość chcesz początkowo pokazać. Oznacza to różnicę między "stanem początkowym" i "przewijaniem w dół", jak pokazano powyżej.

Ten hack powinien osiągnąć to, co chcesz.

+0

Nice, działa dobrze i nie znalazł jeszcze żadnych efektów ubocznych. Dzięki! –

+0

Cieszę się, że to zadziałało, to świetnie. Nie ma za co. – Ethan

+1

Być może jest jednak jedna kwestia: czy istnieje sposób, aby upewnić się, że "w pełni rozwinięta" wysokość nigdy nie przekracza dostępnego miejsca na ekranie urządzenia? Na przykład, jeśli ustawię wysokość na 420p, na moim urządzeniu nadal pozostało trochę miejsca na dole. Ale jeśli ktoś ma znacznie krótsze urządzenie, może przewijać zawartość poza ekranem (obraz zajmuje cały ekran), a następnie nie może już przewijać. To samo, gdy włączasz urządzenie w tryb krajobrazowy. Próbowałem zastosować dolny margines do ControllableAppBarLayout, ale to chyba nic nie robi. –

Powiązane problemy