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