2015-08-11 11 views
7

Ich habe eine Android-Aktivität, die ein CollapsingToolbarLayout in einem CoordinatorLayout verwendet, um eine Bildlauf-/Minimierungs-Symbolleiste mit einem Bild als Hintergrund/Banner zu erstellen.Anfangshöhe des Parallax-Bildes in CollapsingToolbarLayout setzen

Das Bild wird aus dem Internet geladen und ich kenne seine Größe vorher nicht.

Ich möchte, dass die Symbolleiste zunächst eine bestimmte Höhe (160dp) hat, aber wenn das Bild größer ist, würde ich dem Benutzer erlauben, noch weiter nach unten zu scrollen, um den Rest des Bildes freizulegen. Dies sollte jedoch niemals automatisch geschehen. Der Anfangszustand ist 160 dpi, aber der Benutzer sollte in der Lage sein, einen Bildlauf nach unten durchzuführen, um die Höhe des Bildes weiter zu erhöhen.

Ich kann nicht scheinen, die richtige Kombination von Höhe/Minhöhe zu finden, um dies zu erreichen. Ist das überhaupt möglich?

Hier ist mein Layout:

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

Die Höhe des Banners Bildes 160dp eingestellt, der steuert, wie groß die Symbolleiste zunächst, aber offensichtlich diese Art, wie ich es über den 160dp nicht verlängern kann, weil das das ist Höhe der Ansicht.

Ich versuchte 160dp Höhe der CollapsingToolbarLayout oder AppBarLayout aber es hilft nichts, es ist immer maximal 160dp in Höheneinstellung und ich kann es nur nach oben (kleineres Bild) und nicht nach unten, auch wenn das Bild viel größer ist und die ImageView wird als wrap_content skaliert.

Hier ist eine Zeichnung von dem, was ich im Fall erreichen will es nicht klar ist: Mockup of what I want

+0

Ich versuche genau die gleiche Sache zu haben. Hast du es geschafft, dass das funktioniert? –

Antwort

4

Hier ist ein hacky Weg dies zu tun, ich bin eine bessere Art und Weise nicht sicher, aber würde gerne hören . Check out ControllableAppBarLayout

Platz, dass Code in Ihrem Projekt und ersetzen:

android.support.design.widget.AppBarLayout 

mit:

ControllableAppBarLayout 

das Android Set: layout_height von ControllableAppBarLayout die maximale Größe der Symbolleiste zu sein, das heißt die Größe, die Sie in Ihrem Bild "Scrollen weiter unten" möchten.

Dann in Ihrem Code in der onCreate() -Methode können Sie den Zugriff auf die ControllableAppBarLayout erhalten:

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

appBarLayout.collapseToolbar() wird vollständig die Symbolleiste schließen. Sie können jedoch diese Methode in ControllableAppBarLayout ändern:

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

Insbesondere ändern getHeight(), um die Zahl in dp die Differenz zwischen der maximalen Höhe der Symbolleiste Bild darstellen und der Höhe Sie wollen zunächst zeigen. Das heißt, den Unterschied zwischen "Anfangszustand" und "Scrollen weiter unten", wie Sie oben gezeigt haben.

Dieser Hack sollte erreichen, was Sie wollen.

+0

Schön, funktioniert gut und hat noch keine Nebenwirkungen gefunden. Vielen Dank! –

+0

Ich bin froh zu hören, dass es funktioniert hat, das ist großartig. Bitte. – Ethan

+1

Vielleicht ein Problem: Gibt es eine Möglichkeit, sicherzustellen, dass die Höhe "vollständig erweitert" niemals den verfügbaren Bildschirmplatz auf dem Gerät überschreitet? Zum Beispiel, wenn ich die Höhe auf 420dp, auf meinem Gerät habe ich noch etwas Platz an der Unterseite. Aber wenn jemand ein viel kürzeres Gerät hat, kann er den Inhalt vollständig vom Bildschirm scrollen (das Bild nimmt den ganzen Bildschirm ein) und dann können sie nicht mehr hochscrollen. Das gleiche gilt, wenn Sie das Gerät in den Querformatmodus schalten. Ich habe versucht, einen unteren Rand auf das ControlableAppBarLayout anzuwenden, aber das scheint nichts zu tun. –

Verwandte Themen