2

このことは私にはナッツをもたらしています。CoordinatorLayoutとAppBarLayoutを使ってアニメーションを表示すると狂気になることがあります(時々)

私はこの振る舞い(私がしたい正確に何)を取得することができた:私は非常に高速スクロールダウンしたときにhttp://i.imgur.com/PGhL22k.gif

をそして、これが動作ですが、持っている:http://i.imgur.com/kk7icAc.gifhttp://i.imgur.com/YNPNiA6.gif

私は申し訳ありませんが、 GIFは2Mbより大きく、ここにアップロードすることはできません。

ツールバーの同じ量を隠すために、下部のページ区切りバーが必要です。ゆっくりとスクロールするとうまくいくが、速くスクロールすると、上のGIFで見るように、それは本当に奇妙な振る舞いをする。

これは、レイアウトXMLです:

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:kiosk="http://schemas.android.com/apk/res-auto" 
    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"> 

     <include 
      layout="@layout/android_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      kiosk:layout_scrollFlags="scroll|enterAlways"/> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/vpPager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     kiosk:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

    <include 
     layout="@layout/paginator_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     kiosk:layout_behavior="carl.fri.fer.views.KioskPaginator.KioskPaginatorScrollBehaviour"/> 
</android.support.design.widget.CoordinatorLayout> 

"android_toolbar" は次のようである含まれます:

<?xml version="1.0" encoding="utf-8"?> 
<carl.fri.fer.views.KioskToolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/primaryColor" 
    android:minHeight="?attr/actionBarSize"/> 

そして "paginator_layout" は以下の通りです:

<?xml version="1.0" encoding="utf-8"?> 
<carl.fri.fer.views.KioskPaginator.KioskPaginator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/kpPaginator" 
    android:layout_width="match_parent" 
    android:layout_height="40dp" 
    android:layout_alignParentBottom="true" 
    android:animateLayoutChanges="true" 
    android:background="@color/primaryColor" 
    android:clickable="true" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/tvCurrentPage" 
     android:layout_width="50dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:gravity="center" 
     android:padding="10dp" 
     android:textColor="@color/color_pure_black" 
     android:textSize="17sp"/> 

    <LinearLayout 
     android:id="@+id/llMoreOptions" 
     android:layout_width="0dp" 
     android:layout_height="40dp" 
     android:layout_weight="1" 
     android:background="@android:color/transparent" 
     android:gravity="center_vertical" 
     android:orientation="horizontal"/> 

    <TextView 
     android:id="@+id/tvTotalPages" 
     android:layout_width="50dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:gravity="center" 
     android:padding="10dp" 
     android:textColor="@color/color_pure_black" 
     android:textSize="17sp"/> 
</carl.fri.fer.views.KioskPaginator.KioskPaginator> 

そして、 ScrollBehaviorは次のようになります。

public class KioskPaginatorScrollBehaviour extends AppBarLayout.ScrollingViewBehavior { 

    public KioskPaginatorScrollBehaviour(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     float depY = - dependency.getHeight(); 
     depY -= dependency.getY(); 

     Utils.log("dependency", "" + depY); 

     child.setTranslationY(depY); 

     return true; 
    } 
} 

のすべてのページ内に、ViewPagerがあります。フラグメントがあります。この部分のコンテンツは、RecyclerViewの動的コンテンツです。 RecyclerViewのすべてのコンテンツがデータベースからロードされ、実行時にイメージがロードされます。

この奇妙な現象が起こっている理由を教えてもらえますか?どうすれば修正できますか?私は奇妙な行動の原因を発見し

は...事前に

EDIT 1をありがとう! ViewPagerは現在のページとそれに隣接するページを読み込みます。 RecyclerViewのコンテンツはインターネットからロードされ、読み込まれるとすぐにRecyclerViewに入ります。 ViewPagerは最初に現在のページをロードし、次に隣接するページをロードします。 2番目のRecyclerViewがロードしてコンテンツを表示するだけで、現在のページRecyclerView(ツールバーが非表示になっている)をスクロールして、現在のページAppBarLayoutの動作をリセットするので、カスタム表示の動作がリセットされます...どうすれば修正できますか?この... ViewPagerの隣接ページをロードするときRecyclerView内部のインターネット画像からロードするときに

[OK]を、それはまた起こる:私は

EDIT 2 ..隣接するビューをロードしない避けたいです狂っている。

+0

あなたは我々が簡単に問題を再現することができますために、(例えば、githubの上で)どこかにプロジェクトを発行することはできますか? – Divers

+0

申し訳ありませんが、私的なプロジェクトです...必要な情報がほとんどすべてあると思います。しかし、問題を再現しようとする別のプロジェクトに抽象化しようとします。 –

+0

問題を再現するプロジェクトを作成するだけです。実際のプロジェクトを公開する必要はありません。 – Divers

答えて

3

最終的に問題を解決しました。カスタム動作をScrollingViewBehaviorの代わりにCoordinatorLayout.Behaviorに延長すると、期待通りに動作します。ちょうどあなたのビューのtranslationYに値を設定し、それがAppBarLayoutのYに反対です:

public class KioskPaginatorScrollBehaviour extends CoordinatorLayout.Behavior<View> { 

    public KioskPaginatorScrollBehaviour(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     float depY = -dependency.getY(); 
     child.setTranslationY(depY); 
     return true; 
    } 
} 
+0

あなたは私の英雄です!私はいくつかのテストを行い、これが最終的な修正であると確信したら、+200評判で報います。私は 'AppBarLayout.ScrollingBehavior'と' CoordinatorLayout.Behaviour 'の違いについていくつかの調査をしますが、その間にあなたはそれを知っていますか?どうもありがとうございました!!! –

+0

さて、 'AppBarLayout.ScrollingViewBehavior'は' CoordinatorLayout.Behavior'自体を拡張しており、ネストされたスクロールのロジックを持っています。ガイドで推奨されているように、カスタム動作を作成するときは、CoordinatorLayout.Behaviorを拡張する必要があります。 – rom4ek

+0

Perfect、ありがとう。私はカスタムビヘイビアを作成する方法を読むときに何か重要なことを忘れていたはずです... –

関連する問題