我正在用Java创建一个安卓应用程序,在这个应用程序中,我的屏幕上有很多<TextView>
,它们都定义了onTouchListeners。它们被包装在一个<ScrollView>
中,因为它们占用的空间比屏幕上可用的空间多。
我的问题是:当我向上/向下滚动应用程序时,通过触摸屏幕并上下移动手指,卷轴工作正常,但触屏<TextView>
的<TextView>
也会被触发(这可能也是预期的)--不过我不希望这种情况发生。当我触摸屏幕滚动时,我希望onTouchListener被忽略。
我怎样才能做到这一点?我不希望在用户滚动并“意外”在特定的onTouchListener上触发<TextView>
时运行我的函数。
发布于 2016-02-11 03:01:14
在搜索了更多之后,我找到了Stimsoni的这个解决方案。这样做的目的是检查ACTION_DOWN
和ACTION_UP
事件之间的时间是否低于或高于ViewConfiguration.getTapTimeout()
给出的值。
从文件中:
返回持续时间(以毫秒为单位),我们将等待一个触摸事件是一个点击还是滚动。如果用户没有在此间隔内移动,则认为它是一个抽头。
代码:
view.setOnTouchListener(new OnTouchListener() {
private long startClickTime;
@Override
public boolean onTouch(View view, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startClickTime = System.currentTimeMillis();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {
// Touch was a simple tap. Do whatever.
} else {
// Touch was a not a simple tap.
}
}
return true;
}
});
发布于 2016-11-19 20:35:34
我和你有同样的问题,我用ACTION_CANCEL
解决了这个问题。
当以前感觉到的动作(如您的示例中的motionEvent.getActionMasked()
)现在被滚动等其他手势“取消”时,motionEvent.getActionMasked()
等于ACTION_CANCEL
,您的代码可能如下:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent e) {
if (e.getActionMasked() == MotionEvent.ACTION_DOWN) {
// perceive a touch action.
} else if(e.getActionMasked() == MotionEvent.ACTION_UP ||
e.getActionMasked() == MotionEvent.ACTION_CANCEL) {
// ignore the perceived action.
}
}
我希望这能帮到你。
发布于 2019-10-19 13:02:53
我也遇到了类似的问题,但是有了一个TextView,搜索把我带到了这里。文本内容可能会占用比屏幕上可用空间更多的空间。简单工作示例:bpmcounter android (Kotlin)
class MainActivity : AppCompatActivity() {
inner class GestureTap : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent?): Boolean {
// Do your buttonClick stuff here. Any scrolling action will be ignored
return true
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView = findViewById<TextView>(R.id.textView)
textView.movementMethod = ScrollingMovementMethod()
val gestureDetector = GestureDetector(this, GestureTap())
textView.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
}
}
https://stackoverflow.com/questions/35293125
复制相似问题