she*_*kar 5 android android-support-library android-coordinatorlayout
如何使用CoordinatorLayout.Behavior检测嵌套的fling是否完全停止?没有这样的api,当回收者视图完全停止时,它可以给我回调.
我在滚动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)
| 归档时间: |
|
| 查看次数: |
2920 次 |
| 最近记录: |