1

如何定義一個CoordinatorLayout.Behavior類爲BottomNavigationView哪些滾動與RecyclerView veritical滾動同步。垂直滾動協調器底部導航視圖的行爲與RecyclerView垂直滾動

我看過thisthis,但它只是在立即顯示或隱藏了關於縱向滾動事件的NavigationView。我不想立即顯示/隱藏NavigationView,而是我想要一個類似AppbarLayout的行爲,其中Toolbar的滾動標記爲app:layout_scrollFlags="scroll|enterAlways"

public class BottomNavigationBehavior extends CoordinatorLayout.Behavior<BottomNavigationView> { 

    public BottomNavigationBehavior() { 
     super(); 
    } 

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

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, BottomNavigationView child, View dependency) { 
     boolean dependsOn = dependency instanceof FrameLayout; 
     return dependsOn; 
    } 

    @Override 
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, BottomNavigationView child, View directTargetChild, View target, int nestedScrollAxes) { 
     return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; 
    } 

    @Override 
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, BottomNavigationView child, View target, int dx, int dy, int[] consumed) { 
     if(dy < 0) { 
      showBottomNavigationView(child); 
     } 
     else if(dy > 0) { 
      hideBottomNavigationView(child); 
     } 
    } 

    private void hideBottomNavigationView(BottomNavigationView view) { 
     view.animate().translationY(view.getHeight()); 
    } 

    private void showBottomNavigationView(BottomNavigationView view) { 
     view.animate().translationY(0); 
    } 
} 
+0

我會嘗試設置appbarlayout的依賴關係,並根據高度變化的appbarlayout移動BottomNavigationBar –

+0

我的意思是,我要實現就像appbar佈局的行爲的佈局行爲,這是爲了響應RecyclerView滾動事件 – Darish

+0

所以用回收視圖,而不是僅僅unshowing慢慢搬出去? –

回答

1

經過一番努力,我想出了這個解決方案:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
       @Override 
       public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
        super.onScrolled(recyclerView, dx, dy); 
        if(dy > 0 && visible){ 
         mBinding.bnv.test.setY(mBinding.bnv.getY() + dy); 
         DisplayMetrics metrics = new DisplayMetrics(); 
         getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); 
         visible = mBiding.bnv.getY() > metrics.heightPixels; 
         if(!visible) { 
          mBinding.bnv.setY(metrics.heightPixels); 
         } 
        } else { 
         mBinding.bnv.setY(mBinding.bnv.getY() + dy); 
         DisplayMetrics metrics = new DisplayMetrics(); 
         getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); 
         visible = mBinding.bnv.getY() > metrics.heightPixels; 
        } 
     } 

所以你與回收視圖

或用CoordinatorLayout.Behavior類scrollling的BottomNavigationView:

public class ViewScrollWithRecyclerViewBehavior extends CoordinatorLayout.Behavior<View> { 
    private boolean visible = true; 
    private boolean inStartPosition = true; 
    private float oldY; 
    private DisplayMetrics metrics; 



    public ViewScrollWithRecyclerViewBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     metrics = Resources.getSystem().getDisplayMetrics(); 
    } 

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

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     if (dependency instanceof AppBarLayout) { 
      CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); 
      float dy = oldY - dependency.getY(); 
      if(dy > 0 && visible){ 
       moveDown(child, oldY); 
      } else if(!inStartPosition) { 
       moveUp(child, oldY); 
      } 
      oldY = dependency.getY(); 
     } 
     return true; 
    } 

    private void moveUp(View child, float dy){ 
     if(child.getY() + dy >= metrics.heightPixels - child.getHeight()){ 
      child.setY(metrics.heightPixels - child.getHeight()); 
     } else { 
      child.setY(child.getY() + dy); 
     } 
     inStartPosition = child.getY() == metrics.heightPixels - child.getHeight(); 
     visible = child.getY() > metrics.heightPixels; 
    } 


    private void moveDown(View child, float dy){ 
     child.setY(child.getY() + dy); 

     visible = child.getY() > metrics.heightPixels; 
     if(!visible) { 
      child.setY(metrics.heightPixels); 
     } 
    } 

    @Override 
    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final View child, 
             final View directTargetChild, final View target, final int nestedScrollAxes) { 
     return true; 
    } 

    @Override 
    public void onNestedScroll(final CoordinatorLayout coordinatorLayout, 
           final View child, 
           final View target, final int dxConsumed, final int dy, 
           final int dxUnconsumed, final int dyUnconsumed) { 
     super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dy, dxUnconsumed, dyUnconsumed); 
     if(dy > 0 && visible){ 
      moveDown(child, dy); 
     } else if(!inStartPosition) { 
      moveUp(child, dy); 
     } 
    } 


} 
+0

我需要一個擴展Coordinator行爲的類,它可以在問題中解釋的xml中使用。 – Darish

+0

對不起,我以前曾監督它,但是pocess相同 –

+0

你能改寫爲CoordinatorBehavior類 – Darish