2015-09-19 13 views
12

, daha fazla kaydırma yapmaya çalışırken overscroll animasyonunu (en alttaki veya en üstteki parlaklık) göremiyorum. Bununla birlikte, içeriği gözden geçirirseniz, bunu gösterecektir. basit aktivite sınıfı ArdındanLollipop AppBarLayout/Araç Çubuğu, overBankLayout ve Araç Çubuğu ile en temel örneği kullanarak, fazla gezinme animasyonu eksik

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

:

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 uygulamasını kaydırmak için içerikli bir RecycleView sahip bir fragmanı olan Burada

kodu (nav_drawer_toolbar_layout.xml) 'dir. kaydırma yaparken xml den AppBarLayout kaldırmak ve açık Toolbar bırakırsanız

Ancak (sadece AppBarLayout açılıp kapanmasını açıklama), bu overscroll animasyon (ışıma) gösterecektir.

Ya da layout_scrollFlags="scroll"'u kaldırırsanız, aşırı gezinme işlemi çalışır, ancak kaydırma sırasında hareket çubuğunun gizlenmesini sağlayamazsınız. Ekstra bilgi ayıklama RecycleView için

, çizgi

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

2272 daima AppBarLayout dahil olduğunda bitmiş ve o yokken bitmedi. Dokunma olaylarını fazla yazan bir şey mi var?

AppBarLayout ile aşırı hız animasyonunu (kızdırma) kimin göstereceğini bilen var mı?

+0

Merhaba @ kullanıcı654628 Bu konuda herhangi bir güncelleme var mı? şu anda aynı sorunu yaşıyorum: / – CodingBird

cevap

3

DÜZENLEME: Bu hata için ticket görünüyor. Ne olursa olsun artur.dr ... @ gmail.com yaptı ve her zaman geri dönüşü için RecyclerView # dispatchNestedScroll geçersiz kılmak için extecroll animasyonlar çalışma, her ne kadar oldukça emin olsa yanlış (o kendi raporunda yazıyor) geçersiz çizgide bir şey kırılabilir.

Ne yazık ki RecyclerView nasıl kodlanır ve NestedScrollingChild API'sı nasıl yapılır, istenen davranışa sahip olmanın temiz bir yolu yoktur.

Bu, RecyclerView (23.1.1 sürümünden, ancak sorunu düzeltmeden önce herhangi bir sürümüne inanmıyorum) yönteminden scrollByInternal yöntemindedir.

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); 
} 

biz sürece kaydırma tüketir bir ebeveyn olarak orada dispatchNestedScroll (NestedScrollingChild API parçası) için javadoc burada görebileceğiniz gibi, RecyclerView herhangi overscroll animasyon (kenar parıltı) geçerli olmayacaktır.

AppBarLayout, daha fazla spesifik olarak, onStartNestedScroll'da true olarak döndürülen bir NestedScrollingParent olduğu sürece, aşırı hız animasyonları olmayacaktır.

KoordinatörLayout bir NestedScrollingParent'dir, ancak bir CoordinatorLayout.Behavior yoksa, true döndürmez. AppBarLayout'un varsayılan davranışı, dikey kaydırmayı + AppBarLayout'un kaydırmak için bir şeyin bulunduğu + görüntülemenin kaydırma için yeterince büyük olduğu zaman, bu dönüşümü uygular.

// 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 NestedScrollingParent kaydırmayı tüketen eğer bakılmaksızın oluyor overscroll animasyon sağlayan biraz daha farklı bir yaklaşım getiriyor.

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

Dürüst olmak gerekirse, bu bir hata olup olmadığını söyleyemem çünkü her iki mantık da mantıklı. Görünümün üst kısmına ilerliyorsanız ve bir CollapsingToolbar'a benzer bir şeyiniz varsa, aşırı bir animasyonun gerçekleşmesini istemezsiniz. Bununla birlikte, davranışın animasyonun durmasını engellemek için x/y kaydırma miktarını kullanabilmesi için bir yol vardır. Ayrıca kaydırma ve parmakla kaydırma için kodun farklı olması gariptir.