如何检测 onTouch 侦听器中的点击?
我在 ScrollView
中有一个 ViewPager
.我需要能够水平和垂直滚动.为了实现这一点,必须在我的 ViewPager
被触摸时禁用垂直滚动 (v.getParent().requestDisallowInterceptTouchEvent(true);
),以便可以滚动它水平.
I have a ViewPager
inside a ScrollView
. I need to be able to scroll horizontally as well as vertically. In order to achieve this had to disable the vertical scrolling whenever my ViewPager
is touched (v.getParent().requestDisallowInterceptTouchEvent(true);
), so that it can be scrolled horizontally.
但同时我需要能够点击 viewPager 以全屏模式打开它.
But at the same time I need to be able to click the viewPager to open it in full screen mode.
问题是 onTouch 在 onClick 之前被调用,而我的 OnClick 从未被调用.
如何在触摸和点击时同时实现?
viewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println("TOUCHED ");
if(event.getAction() == MotionEvent.???){
//open fullscreen activity
}
v.getParent().requestDisallowInterceptTouchEvent(true); //This cannot be removed
return false;
}
});
viewPager.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("CLICKED ");
Intent fullPhotoIntent = new Intent(context, FullPhotoActivity.class);
fullPhotoIntent.putStringArrayListExtra("imageUrls", imageUrls);
startActivity(fullPhotoIntent);
}
});
推荐答案
Masoud Dadashi 的回答帮我弄清楚了.
Masoud Dadashi's answer helped me figure it out.
这是它最终的样子.
viewPager.setOnTouchListener(new OnTouchListener() {
private int CLICK_ACTION_THRESHOLD = 200;
private float startX;
private float startY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_UP:
float endX = event.getX();
float endY = event.getY();
if (isAClick(startX, endX, startY, endY)) {
launchFullPhotoActivity(imageUrls);// WE HAVE A CLICK!!
}
break;
}
v.getParent().requestDisallowInterceptTouchEvent(true); //specific to my project
return false; //specific to my project
}
private boolean isAClick(float startX, float endX, float startY, float endY) {
float differenceX = Math.abs(startX - endX);
float differenceY = Math.abs(startY - endY);
return !(differenceX > CLICK_ACTION_THRESHOLD/* =5 */ || differenceY > CLICK_ACTION_THRESHOLD);
}
}
相关文章