我试图隐藏一个按钮时,滚动视图是空闲的state.the按钮应该是不可见的,只有在滚动时间。(其余时间按钮应该是可见的)
scrollView.setOnScrollChangeListener(new ScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollX == scrollY) {
Button.setVisibility(View.VISIBLE);
} else if ((scrollY > oldScrollY)) {
Button.setVisibility(View.INVISIBLE);
}
}
});发布于 2017-10-30 13:46:33
找到解决方案
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch( View v, MotionEvent event ) {
switch ( event.getAction( ) ) {
case MotionEvent.ACTION_SCROLL:
case MotionEvent.ACTION_MOVE:
Log.e( "SCROLL", "ACTION_SCROLL" );
break;
case MotionEvent.ACTION_DOWN:
Log.e( "SCROLL", "ACTION_DOWN" );
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
Log.e( "SCROLL", "SCROLL_STOP" );
break;
}
return false;
}
});发布于 2017-10-30 13:35:19
尝试下面的代码
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState == SCROLL_STATE_IDLE){
//do your stuff here
}
}发布于 2019-05-24 00:55:25
尽管这个问题有点老了,而且ScrollView也没有用到,但我不得不实现一些与此相关的东西,我使用的是NestedScrollView per recommendation和Kotlin。
如果你使用的是Java,这是不可能的,或者是“干净”的,你需要创建静态的util方法,而使用Kotlin,你可以做如下所示的扩展函数。如果您使用的是ScrollView,只需将您在此处看到的内容从NestedScrollView更改为ScrollView即可。
我将展示两种实现此功能的方法:
首先,创建NestedScrollViewExtensions.kt文件:
1.
如果您想要一个简化的(我首选的)版本,只需将此代码片段添加到您的NestedScrollViewExtensions.kt文件中:
fun NestedScrollView.onScrollStateChanged(startDelay: Long = 100, stopDelay: Long = 400, listener: (Boolean) -> Unit) {
setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_SCROLL, MotionEvent.ACTION_MOVE -> {
handler.postDelayed({
listener.invoke(true)
}, startDelay)
}
MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
handler.postDelayed({
listener.invoke(false)
}, stopDelay)
}
}
false // Do not consume events
}
}通过这种方式,实现更加清晰:
scroll_view.onScrollStateChanged { isScrolling ->
if(isScrolling) fab.shrink() else fab.extend()
}2
和不太干净的方式
interface NestedViewScrollChangedListener {
fun onScrollStart()
fun onScrollStop()
}
@SuppressLint("ClickableViewAccessibility")
fun NestedScrollView.onScrollStateChanged(listener: NestedViewScrollChangedListener) {
this.setOnTouchListener { _, event ->
when(event.action) {
MotionEvent.ACTION_SCROLL, MotionEvent.ACTION_MOVE -> {
handler.postDelayed({
listener.onScrollStart()
}, 100)
}
MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
handler.postDelayed({
listener.onScrollStop()
}, 400)
}
}
false // Don't consume touch events
}
}在这里,我使用了一个简单的延迟,这对我来说很有效,因为我需要一个动画发生,你可以随意删除所有的handler.postDelay()并直接调用监听器。
NestedViewScrollChangedListener上面的接口需要这样实现:
scroll_view.onScrollStateChanged(object : NestedViewScrollChangedListener {
override fun onScrollStart() {
fab.shrink()
}
override fun onScrollStop() {
fab.extend()
}
})祝你好运:)
https://stackoverflow.com/questions/47008608
复制相似问题