Android 滚动时在NestedScrollView中隐藏晶圆厂
我有一个嵌套的ScrollView,里面有一些线性布局和文本视图之类的内容。 我使用floatingactionbutton库也是出于某些原因。所以我不能用任何行为来解释它。 我不知道应该如何处理scrollview中的scrollchangelistener,以便像行为一样动态隐藏和显示fabAndroid 滚动时在NestedScrollView中隐藏晶圆厂,android,scrollview,floating-action-button,nestedscrollview,Android,Scrollview,Floating Action Button,Nestedscrollview,我有一个嵌套的ScrollView,里面有一些线性布局和文本视图之类的内容。 我使用floatingactionbutton库也是出于某些原因。所以我不能用任何行为来解释它。 我不知道应该如何处理scrollview中的scrollchangelistener,以便像行为一样动态隐藏和显示fab 有没有关于如何在滚动时隐藏和显示晶圆厂的建议?创建晶圆厂滚动行为类 public class FabScrollBehavior extends CoordinatorLayout.Behavior&l
有没有关于如何在滚动时隐藏和显示晶圆厂的建议?创建晶圆厂滚动行为类
public class FabScrollBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
private int toolbarHeight;
public FabScrollBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
this.toolbarHeight = AppUtil.getToolbarHeight(context);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
if (dependency instanceof AppBarLayout) {
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
int distanceToScroll = fab.getHeight() + fabBottomMargin;
float ratio = (float)dependency.getY()/(float)toolbarHeight;
fab.setTranslationY(-distanceToScroll * ratio);
}
return true;
}
}
然后在布局中添加到FloatingActionButton布局\u行为:
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_task_accept"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_accepted"
app:layout_behavior="pass.to.your.FabScrollBehavior.Class"
app:theme="@style/Widget.AppTheme.Fab"/>
简单将以下代码添加到NestedScrollView ScrollChangeListener:
NestedScrollView nsv = v.findViewById(R.id.nsv);
nsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY > oldScrollY) {
fab.hide();
} else {
fab.show();
}
}
});
在活动或片段中定义变量类型int,从ScrollView设置上一个滚动,然后使用此方法在ScrollView类中侦听更改滚动
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
// previousScrollY this variable is define in your Activity or Fragment
if (scrollView.getScrollY() > previousScrollY && floatingActionButton.getVisibility() == View.VISIBLE) {
floatingActionButton.hide();
} else if (scrollView.getScrollY() < previousScrollY && floatingActionButton.getVisibility() != View.VISIBLE) {
floatingActionButton.show();
}
previousScrollY = scrollView.getScrollY();
}
});
scrollView.getViewTreeObserver().addOnScrollChangedListener(新的ViewTreeObserver.OnScrollChangedListener(){
@凌驾
public void onScrollChanged(){
//上一次滚动此变量是在活动或片段中定义的
if(scrollView.getScrollY()>previousScrollY&&floatingActionButton.getVisibility()==View.VISIBLE){
floatingActionButton.hide();
}else if(scrollView.getScrollY()
将完成所有版本的android在花了这么多时间之后,我找到了解决方案。
它可以在所有情况下工作。虽然这是一个黑客不是正确的解决方案,但你可以应用它使这件事的工作
正如我们所知,setOnScrollChangeListener
仅在最低api级别为23时才起作用,所以如果我的最低api级别低于23会怎么样
所以我从堆栈溢出中找到了解决方案,我们可以使用getViewTreeObserver().addOnScrollChangedListener
来解决这个问题,所以这将是适用于所有设备的兼容解决方案
现在,让我们转到“嵌套滚动视图滚动时隐藏fab按钮,嵌套滚动视图处于理想状态时显示fab按钮”问题的最终解决方案
因此,我们可以使用Handler
和postDelayed
来解决这个问题
在上下文中定义变量private int previousScrollY=0代码>
然后使用getViewTreeObserver().addOnScrollChangedListener
到嵌套的滚动视图,如下所示
NESTEDSCROLLVIEW.getViewTreeObserver().addOnScrollChangedListener(新
ViewTreeObserver.OnScrollChangedListener(){
@凌驾
public void onScrollChanged(){
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
if(NESTEDSCROLLVIEW.getScrollY()==previousScrollY){
FABBUTTON.setVisibility(View.VISIBLE);
}否则{
FABBUTTON.setVisibility(视图.不可见);
}
}
}, 10);
previousScrollY=NESTEDSCROLLVIEW.getScrollY();
}
});代码>
现在你准备好出发了
检查这些解决方案:已经有了。什么都不管用。请仔细阅读:并检查上的cheesesquareGitHub@piotrek1543请注意,我使用的floatingactionbutton库不同,不支持行为,因此如果我尝试添加“app:layout\u behavior=“package,应用程序崩溃。cheesesquare正在使用默认的FloatingAction按钮。抱歉,我忘记了。所以,问问这个库的作者,我的意思是在Github页面上创建问题非常棒,但是布局行为只使用“pass.to.FabScrollBehavior”,这需要API级别23或更高。你确定吗?我在API级别19中使用它。我非常确定。有。您将在右上角找到一条文字,上面写着“Added in API level 23”,您的IDE也应该指出这一点;这是真的。它确实是这样工作的,但是它只在嵌套的ScrollView上工作。这是不可靠的。它偶尔工作。另外,当滚动结束时,FAB应该显示更好的ux,这是不可能的,因为状态无法读取。
NestedScrollView nsv = v.findViewById(R.id.nsv);
nsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY > oldScrollY) {
fab.hide();
} else {
fab.show();
}
}
});
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
// previousScrollY this variable is define in your Activity or Fragment
if (scrollView.getScrollY() > previousScrollY && floatingActionButton.getVisibility() == View.VISIBLE) {
floatingActionButton.hide();
} else if (scrollView.getScrollY() < previousScrollY && floatingActionButton.getVisibility() != View.VISIBLE) {
floatingActionButton.show();
}
previousScrollY = scrollView.getScrollY();
}
});