如何检测CoordinatorLayout.Behavior中停止的嵌套fling?

she*_*kar 5 android android-support-library android-coordinatorlayout

如何使用CoordinatorLayout.Behavior检测嵌套的fling是否完全停止?没有这样的api,当回收者视图完全停止时,它可以给我回调.

Jus*_*ick 6

我在滚动RecyclerView时尝试隐藏浮动操作按钮(FAB)时开始关注这个兔子洞.根据多个来源执行此操作的正确方法是扩展FloatingActionButton.Behavior,覆盖和方法,并将您的行为挂钩到FAB,例如.这适用于普通(慢)滚动事件,但在结束时不会调用. onStartNestedScrollonStopNestedScrollapp:layout_behavior="com.justingarrick.ui.ScrollAwareFabBehavior"onStopNestedScroll

目前,似乎存在许多关于投掷和滚动行为的未决问题 ; 我的解决方法是实现一个OnScrollListener为我的RecyclerView并且只是以编程方式改变FAB的状态,例如

public class MyFragment extends Fragment {

    @Bind(R.id.account_list) RecyclerView recyclerView;
    @Bind(R.id.button_fab) FloatingActionButton fab;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_accounts, container, false);
        ButterKnife.bind(this, view);

        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING)
                    fab.hide(); // or hideFab(), see below
                else if (newState == RecyclerView.SCROLL_STATE_IDLE)
                    fab.show(); // or showFab(), see below
            }
        });

        return view;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:这在99%的情况下正常工作,但是如果您使用设计库22.2.1版本中的show()and和hide()方法,当您尝试向上滚动RecyclerView顶部或向下滚动时,您将遇到问题RecyclerView的底部,因为回收者视图正在快速切换状态RecyclerView.SCROLL_STATE_DRAGGING,RecyclerView.SCROLL_STATE_IDLE从而在其中创建竞争条件FloatingActionButtonHoneycombMr1#show().所以,为了解决这个问题(叹气),setVisibility()如果你不关心动画,你需要切换到调用,或者在没有竞争条件的情况下重新实现动画,例如

private void hideFab() {
     fab.animate().scaleX(0.0F).scaleY(0.0F).alpha(0.0F).setDuration(200L).setInterpolator(new FastOutSlowInInterpolator()).setListener(new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
             fab.setVisibility(View.GONE);
         }
     });
 }

 private void showFab() {
     fab.animate().scaleX(1.0F).scaleY(1.0F).alpha(1.0F).setDuration(200L).setInterpolator(new FastOutSlowInInterpolator()).setListener(new AnimatorListenerAdapter() {
         @Override
         public void onAnimationStart(Animator animation) {
            fab.setVisibility(View.VISIBLE);
         }
     });
 }
Run Code Online (Sandbox Code Playgroud)