6

最近のアンドロイドのステータスバーに似たレイアウトを作っています。下にスクロールする閉じるツールバーを表示しないで表示

enter image description here

私は、コンテナ内の2 Viewsを持っています。 ViewPagerおよびRecyclerView。 デフォルトの動作では、RecyclerViewをスクロールすると、ViewPagerのサイズを小さくしたい、その逆の設定をします。

enter image description here

ロジック:

viewPagerMaxHeight = 200; 
if scrollTop 
    is ViewPager.height > viewPagerMaxHeight? 
    YES: Prevent Scroll and Decrease ViewPager size apropriatry 
    No: Scroll RecyclerView 
if scrollBottom 
    did we scroll to position 0? 
    YES: Start increasing ViewPager size 
    No: Scroll RecyclerView 

ほとんどのノート: - RecyclerViewは、様々なサイズの項目が含まれています。 - アイテムが削除されて追加されることがある - 単純なRecyclerViewで、 ではなく、互いに崩壊する通知に似ています。

自分でロジックのほとんどを構築できますが、スクロールされた方向と量を返すRecyclerViewのリスナーを正しく作成できませんでした。私は、私はRecycleViewためのパディングを設定し、最初の項目にNestedScrollViewをスクロールしていgithub

v.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { 
    @Override 
    public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 
     Log.e("scrollY", ""+scrollY); 
     Log.e("oldScrollY", ""+oldScrollY); 
     Log.e("currentHeight", ""+currentHeight); 
     if(scrollY == 200) { 
      Log.e("==200", "JU"); 
     } else if (scrollY < 200) { 
      Log.e("<200", ""+currentHeight); 

      if(currentHeight < fullHeight) { 
       Log.e("current<full", Integer.toString(deltaScroll)); 
       deltaScroll = oldScrollY - scrollY; 
       currentHeight = currentHeight + deltaScroll; 
       if(currentHeight > fullHeight) { 
        currentHeight = fullHeight; 
       } 
       ku.getLayoutParams().height = currentHeight; 
       ku.requestLayout(); 
      } 
      v.scrollTo(0, 200); 
     } else if (scrollY > oldScrollY) { 
      Log.e("Scroll DOWN", "" + Integer.toString(scrollY)); 
      deltaScroll = scrollY - oldScrollY; 
      currentHeight = currentHeight - deltaScroll; 
      if(currentHeight > minHeight) { 
       ku.getLayoutParams().height = currentHeight; 
       ku.requestLayout(); 
       v.scrollTo(0, 200); 

      } else { 
       currentHeight = minHeight; 
       ku.getLayoutParams().height = minHeight; 
       ku.requestLayout(); 
      } 

     } 
    } 
}); 

に例を行った

: はスクロールからRecyclerViewを防止することがボーナス

EDITですパディングは表示されません。これにより、すでにTOPにいてもTOPをスクロールできます。

すべてがうまくいくように見えますが、ゆっくりとスクロールするとスクロールが「不安定」になることがわかります(スクロールしても十分には起こりません)。 NestedScrollView自体が高さが変わってしまい、たとえばスクロールアップ中にスクロールダウンが発生するため、私の推測は起こっていると思います。あなたの現在のコードによると

+1

は、しばしば「びくびくのパフォーマンスにつながります。 ViewPagerを使って何を使っているのか詳しく教えていただけますか?可能であればレイアウトXMLを共有してください。 –

+1

コーディネーターのレイアウトを見てください – Rainmaker

+0

@AbhishekSinghすべての私の意見が入っているgithubがあります – CBeTJlu4ok

答えて

2

上記は、ConstraintLayoutおよびGuidelineの助けを借りて完全に実行可能です。あなたがスクロールアップするとき、ガイドラインを最小限にプログラムで設定し、スクロールダウンするとギルドラインを通常に戻します。以下は

はあなたにもNestedScrollView内のビューを配置することができ、同じ

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 


    <android.support.constraint.Guideline 
     android:id="@+id/viewPagerTopGuideline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.1" /> 


    <android.support.constraint.Guideline 
     android:id="@+id/viewPagerBottomGuideline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.5" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewPager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_constraintBottom_toTopOf="@+id/viewPagerBottomGuideline" 
     app:layout_constraintTop_toBottomOf="@+id/viewPagerTopGuideline"> 

    </android.support.v4.view.ViewPager> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_constraintTop_toBottomOf="@+id/viewPagerBottomGuideline"/> 

</android.support.constraint.ConstraintLayout> 

のためのXMLサンプルです。その後、onscrollあなたは私がちょうどスクロールアップで実装されているこの

@BindView(R.id.viewPagerBottomGuideline) 
Guideline guideLine;//have Used ButterKnife 

ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideLine.getLayoutParams(); 
      params.guidePercent = 0.20f; // 45% // range: 0 <-> 1 
      guideLine.setLayoutParams(params); 

のようなガイドラインを設定することができ、あなたはダウンだけでなく、スクロールのための同じを実装する必要があります。

+0

CoordinatorLayoutまたはConstraintLayoutは使用できません。 – CBeTJlu4ok

+0

私はそれを使用することはできませんが、これは正解である – CBeTJlu4ok

2

すべてが動作しているようですが、あなたはゆっくりスクロール時にスクロールが「ビクビク」でわかりますよう...

YES、これはあるので、メソッドonScrollChangeは、ユーザーがゆっくりとスクロールしたとき(システムが誤ってscroll ==> stop ==> scroll ==> stop ==> scroll ==> stop ==>...のように誤っているため)、何回か呼び出される可能性があります。したがって、メソッド内のロジックは何度も実行されます。 gic(ifおよびelse)これは、UIの応答性に影響を与える可能性があります。これは、ユーザーがスクロールして1回だけ呼び出され、1回のスクロールとして解釈された場合には発生しません。

SOLUTION:

  1. 可能な場合は、あなたのコード内のいくつかの面倒な計算とロジックを削減します。
  2. LinearLayoutではなくルートレイアウトとしてを使用し、Behavioursには、Viewsの子孫がCoordinatorLayoutの後に続くように設定してください。それ以外の場合は、booleanを使用してロジックを準備します。これにより、メソッドonSrollChangeの内容は、何度も呼び出されることはなく、ユーザーが最終的にスロースクロール全体を終了したときに1回だけ呼び出されます。
+0

私はCoordinatorLayoutまたはConstraintLayoutを使用できません。コールの数は問題ではありません。私はあなたが自分のコードを検査する時間を費やしたとは思わない。 – CBeTJlu4ok

+0

あなたのコードを読んでください! githubでも、問題は何度も呼ばれているメソッドです!以前のアニメーションが終了し、アニメーションの更新が以前のアニメーションが終了した後に保存される場合にのみ読み込まれるアニメーションを試してみてください。これもユーザーフレンドリーです! – Xenolion

+0

はアイデアのように聞こえるし、ここで賞金を授与する時間がほとんどないので、 – CBeTJlu4ok

2

メインレイアウト(ルートレイアウト)としてCoOrdinate Layoutを使用することをお勧めします。 あなたがする必要があることは、この動作を、JavaまたはコーディングによるCollapsing Toolbarのようなものに設定することだけです。私は同じことを実装して、thisリンクが本当に私をたくさん助けました。リンクをクリックして試してみてください。 RecyclerViewとNestedScrollViewをミキシング

https://github.com/teocci/AndroidGuidenotes/wiki/Handling-Scrolls-with-CoordinatorLayout

+0

このリンクは本当に非常に助けになります.. –

+0

このリンクは質問に答えるかもしれませんが、ここで重要な部分を提供してください。 –

+0

私はCoordinatorLayoutまたはConstraintLayoutを使用できません – CBeTJlu4ok

関連する問題