2015-09-19 5 views
12

mit dem einfachsten Beispiel mit AppBarLayout und Toolbar, kann ich nicht die Overscroll-Animation (das Glühen von unten oder oben) beim Scrollen mehr zu sehen. Wenn Sie jedoch den Inhalt umwerfen, wird er angezeigt. HierLollipop AppBarLayout/Toolbar fehlende Overscroll Animation

ist der Code (nav_drawer_toolbar_layout.xml):

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- Replace fragments in this content frame, like a RecycleView --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:minHeight="?attr/actionBarSize" 
      app:titleTextAppearance="@style/Base.TextAppearance.AppCompat.Title" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      app:layout_scrollFlags="scroll|enterAlways"/> 
    </android.support.design.widget.AppBarLayout> 

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

Gefolgt von einfacher Aktivitätsklasse:

public class MyActivity extends AppCompatActivity implements { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nav_drawer_toolbar_layout); 

     // Setup the toolbar/actionbar 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FragmentManager manager = getFragmentManager(); 
     manager.beginTransaction().replace(R.id.content_frame, new MyFragmentList).commit(); 
    } 
} 

MyFragmentList ist ein Fragment mit einem RecycleView mit Inhalt die App zu blättern.

Wenn ich jedoch AppBarLayout aus dem XML entferne und die Toolbar offen lasse (einfach AppBarLayout öffnen und schließen), wird beim Scrollen die Overscroll-Animation (das Glühen) angezeigt.

Oder wenn Sie layout_scrollFlags="scroll" entfernen, funktioniert der Overscroll, aber Sie können die Aktionsleiste nicht ausblenden, wenn Sie scrollen.

Für zusätzliche Informationen, Debuggen RecycleView, Linie 2272

if(this.mBottomGlow != null && !this.mBottomGlow.isFinished()) { 

ist immer fertig, wenn AppBarLayout einschließlich und nicht fertig, wenn sie nicht da ist. Überschreibt etwas seine Touch-Events?

Weiß jemand, wer Overscroll-Animation (glühen) mit AppBarLayout zeigen?

+0

Hi @ user654628 Haben Sie ein Update dazu? Ich habe das gleiche Problem wie Sie jetzt: / – CodingBird

Antwort

3

EDIT: Es scheint eine ticket für diesen Fehler zu sein. Du könntest definitiv tun, was artur.dr ... @ gmail.com getan hat und RecyclerView erweitern, um RecyclerView zu überschreiben # dispatchNestedScroll, um immer false zurückzugeben (er schreibt wahr in seinem Bericht), du kannst Overscroll-Animationen erhalten, obwohl ich mir ziemlich sicher bin könnte etwas auf der Linie brechen.

Leider, wie RecyclerView codiert ist und wie NestedScrollingChild API gemacht wird gibt es keine saubere Möglichkeit, das gewünschte Verhalten zu haben.

Dies ist von RecyclerView (23.1.1, ich glaube jedoch keine Version, bevor es das Problem behebt) in der Methode scrollByInternal.

if (dispatchNestedScroll(consumedX, consumedY, unconsumedX, unconsumedY, mScrollOffset)) { 
    // Update the last touch co-ords, taking any scroll offset into account 
    mLastTouchX -= mScrollOffset[0]; 
    mLastTouchY -= mScrollOffset[1]; 
    if (ev != null) { 
     ev.offsetLocation(mScrollOffset[0], mScrollOffset[1]); 
    } 
    mNestedOffsets[0] += mScrollOffset[0]; 
    mNestedOffsets[1] += mScrollOffset[1]; 
} else if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) { 
    if (ev != null) { 
     pullGlows(ev.getX(), unconsumedX, ev.getY(), unconsumedY); 
    } 
    considerReleasingGlowsOnScroll(x, y); 
} 

Da wir hier auf dem javadoc für dispatchNestedScroll (Teil der NestedScrollingChild API) sehen kann, solange es ein Elternteil, der die Schriftrolle verbraucht, RecyclerView keine Anwendung jede Überroll Animation (Kantenglüheffekt).

AppBarLayout verbraucht Scrolling, genauer gesagt, solange es ein NestedScrollingParent gibt, das bei onStartNestedScroll true zurückgibt, werden Overscroll-Animationen nicht passieren.

CoordinatorLayout ist ein NestedScrollingParent, gibt aber nur dann True zurück, wenn ein CoordinatorLayout.Behavior vorhanden ist. Das Standardverhalten von AppBarLayout implementiert diese Methode, um bei vertikalem Scrollen True zurückzugeben. + AppBarLayout hat etwas zum Scrollen + View ist groß genug zum Scrollen.

// Return true if we're nested scrolling vertically, and we have scrollable children 
// and the scrolling view is big enough to scroll 
final boolean started = (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0 
      && child.hasScrollableChildren() 
      && parent.getHeight() - directTargetChild.getHeight() <= child.getHeight(); 

Flinging nimmt einen etwas anderen Ansatz, die Überroll Animation ermöglicht geschieht unabhängig davon, ob die NestedScrollingParent das Scrollen verbraucht.

if (!dispatchNestedPreFling(velocityX, velocityY)) { 
    final boolean canScroll = canScrollHorizontal || canScrollVertical; 
    dispatchNestedFling(velocityX, velocityY, canScroll); 

    if (canScroll) { 
     velocityX = Math.max(-mMaxFlingVelocity, Math.min(velocityX, mMaxFlingVelocity)); 
     velocityY = Math.max(-mMaxFlingVelocity, Math.min(velocityY, mMaxFlingVelocity)); 
     mViewFlinger.fling(velocityX, velocityY); 
     return true; 
    } 
} 

Ehrlich gesagt kann ich nicht sagen, ob das ein Fehler ist, weil beide Logik sinnvoll sind. Wenn Sie zum oberen Teil der Ansicht scrollen und etwas wie eine CollapsingToolbar haben, möchten Sie nicht, dass eine Overcoll-Animation stattfindet. Es gibt jedoch einen Weg, um es so zu machen, dass das Verhalten den x/y-Betrag des Scrollens konsumieren kann, um die Animation zu stoppen. Es ist auch seltsam, dass beide für Scrollen und Schleudern unterschiedlich sind.