2015-09-19 10 views
12

AppBarLayoutとツールバーで最も基本的な例を使用して、スクロールするときにオーバースクロールアニメーション(下から上への輝き)が表示されません。しかし、あなたがコンテンツを飛ばした場合、それが表示されます。単純なアクティビティクラス続くLollipop AppBarLayout /ツールバーにオーバースキャンアニメーションがありません

<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アプリをスクロールするコンテンツとRecycleView有する断片である。ここで

コード(nav_drawer_toolbar_layout.xml)です。

xmlからAppBarLayoutを削除してツールバーを開いたままにしておくと(AppBarLayoutの開始と終了のコメントのみ)、スクロールするときにオーバースクロールアニメーション(グロー)が表示されます。

layout_scrollFlags="scroll"を削除すると、オーバースクロールが機能しますが、スクロールするときにアクションバーを非表示にすることはできません。追加情報、デバッグのためにRecycleView

、ラインが

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

2272常にAppBarLayoutを含めたときに終了し、それが存在しないときに終了していません。そのタッチイベントの上書きは何ですか?

誰もがAppBarLayoutでオーバースクロールアニメーション(グロー)を表示する人を知っていますか?

+0

こんにちは@ user654628これに関する更新情報はありますか?あなたと今同じ問題がある私:/ – CodingBird

答えて

3

編集:このバグのためにticketがあるようです。あなたは確かにartur.dr ... @ gmail.comがしたことを行うことができ、RecyclerViewを上書きするようにRecyclerViewを拡張することができます#dispatchNestedScrollは常にfalseを返します(彼は彼のレポートに真実を書いています)何かを破るかもしれない。

残念ながら、RecyclerViewがどのようにコード化され、どのようにNestedScrollingChild APIが作成されるかは、望ましい動作をするためのきれいな方法ではありません。

これはRecyclerView(23.1.1ですが、問題を修正する前のバージョンはありません)が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); 
} 

私たちがいる限り、スクロールを消費片方の親があるとして、RecyclerViewは任意のオーバースクロールアニメーション(エッジグロー)が適用されませんdispatchNestedScrollのjavadoc(NestedScrollingChildのAPIの一部)で、ここで見ることができるように。

AppBarLayoutは、onStartNestedScrollでtrueを返すNestedScrollingParentが存在する限り、スクロールを消費しますが、オーバーフローアニメーションは発生しません。

CoordinatorLayoutはNestedScrollingParentですが、CoordinatorLayout.Behaviorが存在しない限りtrueを返しません。 AppBarLayoutのデフォルトの振る舞いは、垂直スクロール+ AppBarLayoutが何かを持っているときにtrueを返すようにこのmethdoを実装しています+スクロールするのに十分な大きさのビューです。

// 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(); 

投げつけはNestedScrollingParentがスクロールを消費している場合に関係なく起こっオーバースクロールアニメーションを可能にし、わずかに異なるアプローチを採用しています。

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

真実私は両方の論理が意味をなさないので、これがバグかどうかわかりません。ビューの上部にスクロールしてCollapsingToolbarのようなものがある場合は、オーバースコアアニメーションが発生しないようにします。しかし、アニメーションが起こらないようにスクロールのx/y量を消費することができるようにする方法があります。また、スクロールとフロイングの両方のコードが異なることも奇妙です。

関連する問題