Ich versuche herauszufinden, wie die Animation zum Erweitern / Reduzieren der Symbolleiste ausgeführt wird. Wenn Sie sich die Einstellungen der Telegramm-App ansehen, werden Sie feststellen, dass es eine Listenansicht und die Symbolleiste gibt. Wenn Sie nach unten scrollen, wird die Symbolleiste ausgeblendet und beim Scrollen nach oben erweitert. Es gibt auch die Animation des Profilbildes und des FAB. Hat jemand eine Ahnung davon? Glaubst du, sie haben alle Animationen darauf aufgebaut? Vielleicht fehlt mir etwas in den neuen APIs oder in der Support-Bibliothek.
Beim Öffnen des Spinners ist mir dasselbe Verhalten in der Google Kalender-App aufgefallen (ich glaube nicht, dass es sich um einen Spinner handelt, aber es sieht so aus): Die Symbolleiste wird erweitert und beim Scrollen wird sie ausgeblendet.
Nur zur Klarstellung: Ich brauche die QuickReturn-Methode nicht. Ich weiß, dass die Telegramm-App wahrscheinlich etwas Ähnliches verwendet. Die genaue Methode, die ich benötige, ist der Google Kalender-App-Effekt. Ich habe es mit versucht
android:animateLayoutChanges="true"
und die expand-Methode funktioniert ziemlich gut. Wenn ich in der ListView nach oben scrolle, wird die Symbolleiste natürlich nicht ausgeblendet.
Ich habe auch darüber nachgedacht, ein hinzuzufügen, GestureListener
aber ich möchte wissen, ob es APIs oder einfachere Methoden gibt, um dies zu erreichen.
Wenn es keine gibt, denke ich, werde ich mit dem gehen GestureListener
. Hoffentlich einen reibungslosen Effekt der Animation.
Vielen Dank!
quelle
Schauen Sie sich
CollapsingTitleLayout
auch Chris Banes im Android-Team an: https://plus.google.com/+ChrisBanes/posts/J9Fwbc15BHNCode: https://gist.github.com/chrisbanes/91ac8a20acfbdc410a68
quelle
Verwenden Sie die Design-Support-Bibliothek http://android-developers.blogspot.in/2015/05/android-design-support-library.html
Fügen Sie dies in build.gradle ein
compile 'com.android.support:design:22.2.0' compile 'com.android.support:appcompat-v7:22.2.+'
Für die Recycler-Ansicht ist dies ebenfalls enthalten
compile 'com.android.support:recyclerview-v7:22.2.0'
<!-- AppBarLayout allows your Toolbar and other views (such as tabs provided by TabLayout) to react to scroll events in a sibling view marked with a ScrollingViewBehavior.--> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true"> <!-- specify tag app:layout_scrollFlags --> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways"/> <!-- specify tag app:layout_scrollFlags --> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:scrollbars="horizontal" android:layout_below="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways"/> <!-- app:layout_collapseMode="pin" will help to pin this view at top when scroll --> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:text="Title" android:gravity="center" app:layout_collapseMode="pin" /> </android.support.design.widget.AppBarLayout> <!-- This will be your scrolling view. app:layout_behavior="@string/appbar_scrolling_view_behavior" tag connects this features --> <android.support.v7.widget.RecyclerView android:id="@+id/list" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.design.widget.CoordinatorLayout>
Ihre Aktivität sollte AppCompatActivity erweitern
public class YourActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); //set toolbar Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } }
Ihr App-Thema sollte so sein
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> </style> </resources>
quelle
Dies ist meine Implementierung:
collapsedHeaderHeight
undexpandedHeaderHeight
sind woanders definiert, mit der FunktiongetAnimationProgress
kann ich den Fortschritt Erweitern / Reduzieren erhalten, basierend auf diesem Wert mache ich meine Animation und zeige / verstecke den realen Header.listForumPosts.setOnScrollListener(new AbsListView.OnScrollListener() { /** * @return [0,1], 0 means header expanded, 1 means header collapsed */ private float getAnimationProgress(AbsListView view, int firstVisibleItem) { if (firstVisibleItem > 0) return 1; // should not exceed 1 return Math.min( -view.getChildAt(0).getTop() / (float) (expandedHeaderHeight - collapsedHeaderHeight), 1); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // at render beginning, the view could be empty! if (view.getChildCount() > 0) { float animationProgress = getAnimationProgress(view, firstVisibleItem); imgForumHeaderAvatar.setAlpha(1-animationProgress); if (animationProgress == 1) { layoutForumHeader.setVisibility(View.VISIBLE); } else { layoutForumHeader.setVisibility(View.GONE); } } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // do nothing } }
quelle