我在滚动视图处于空闲状态时试图隐藏按钮。按钮在滚动时间内应该是不可见的。(其余的时间按钮应该是可见的)
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);
}
}
});
答案 0 :(得分:0)
尝试以下代码
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState == SCROLL_STATE_IDLE){
//do your stuff here
}
}
答案 1 :(得分:0)
找到解决方案
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;
}
});
答案 2 :(得分:0)
即使这个问题有点老了,ScrollView
并没有被使用,但我不得不实现一些与此相关的东西,我在每个建议和Kotlin上都使用了NestedScrollView
。
如果您使用的是Java,那么这将是不可能的或“干净的”
如果您使用的是ScrollView
,只需将此处显示的内容从NestedScrollView
更改为ScrollView
。
首先,创建您的NestedScrollViewExtensions.kt
文件:
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()
并直接调用侦听器。
上面的接口需要这样实现:
scroll_view.onScrollStateChanged(object : NestedViewScrollChangedListener {
override fun onScrollStart() {
fab.shrink()
}
override fun onScrollStop() {
fab.extend()
}
})
如果您想要简化的版本(我的首选),只需在其中添加(或更改)NestedScrollViewExtensions.kt
内容:
@SuppressLint("ClickableViewAccessibility")
fun NestedScrollView.onScrollStateChanged(listener: (Boolean) -> Unit) {
this.setOnTouchListener { _, event ->
when(event.action) {
MotionEvent.ACTION_SCROLL, MotionEvent.ACTION_MOVE -> {
handler.postDelayed({
listener.invoke(true)
}, 100)
}
MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
handler.postDelayed({
listener.invoke(false)
}, 400)
}
}
false
}
}
这样,实现更干净:
scroll_view.onScrollStateChanged { isScrolling ->
if(isScrolling) fab.shrink() else fab.extend()
}
祝你好运:)
答案 3 :(得分:0)
在Kotlin中,您可以使用此
inline fun NestedScrollView.scrollState(crossinline idle: () -> Unit, crossinline scrolled: () -> Unit) {
setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_SCROLL,
MotionEvent.ACTION_MOVE,
MotionEvent.ACTION_DOWN -> {
scrolled()
}
MotionEvent.ACTION_CANCEL,
MotionEvent.ACTION_UP -> {
idle()
}
}
false
}
}