问题描述
我在 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); } }