Я реализовал перетаскивание для закрытия и масштабирования в Fragment of ViewPager.Теперь, его смахивание не было гладким, потому что касания ViewPager и представления во фрагменте конфликтуют друг с другом.Итак, я написал класс CustomViewPager для переопределения метода ' onInterceptTouchEvent ', чтобы я мог обнаружить, что если это горизонтальное перелистывание, а представление фрагмента еще не увеличено или не перетаскивается, то ViewPager должен использовать касания, чтобы избежать конфликтов и сделатьпроведите гладкоНо проблема, с которой я сталкиваюсь, заключается в том, что нажатие кнопок также не вызывает действий, так как ViewPager не передает их касание, и если я не перехватываю касание в ViewPager, тогда ViewPager и конфликт фрагментов.Как я могу разрешить клики дочерних элементов, но использовать другие события, например ACTION_MOVE, пока я не хочу, чтобы он передавался дочерним элементам.
CustomViewPager:
public class DemoViewPager extends ViewPager {
private final int THRESHOLD = ScreenUtils.dpToPx(20);
float diffX, diffY;
private float initialXValue;
private float initialYValue;
private MotionEventListener motionEventListener;
public DemoViewPager(@NonNull Context context) {
super(context);
}
public DemoViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
initialXValue = ev.getX();
initialYValue = ev.getY();
return true;
// break;
case MotionEvent.ACTION_MOVE:
diffX = ev.getX() - initialXValue;
diffY = ev.getY() - initialYValue;
boolean isHorizontalSwipe = Math.abs(diffY) < THRESHOLD;
boolean isDraggable = motionEventListener != null && (motionEventListener.isDragging() || motionEventListener.isZoomed());
if (!isHorizontalSwipe || isDraggable) {
return true;
}
// return true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
break;
//return true;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
initialXValue = ev.getX();
initialYValue = ev.getY();
if (motionEventListener != null)
motionEventListener.onMotionEventReceived(ev);
break;
case MotionEvent.ACTION_MOVE:
diffX = ev.getX() - initialXValue;
diffY = ev.getY() - initialYValue;
boolean isHorizontalSwipe = Math.abs(diffY) < THRESHOLD;
boolean isDraggable = motionEventListener != null && (motionEventListener.isDragging() || motionEventListener.isZoomed());
if (!isHorizontalSwipe || isDraggable) {
if (motionEventListener != null)
motionEventListener.onMotionEventReceived(ev);
if (isDraggable)
return false;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (motionEventListener != null)
motionEventListener.onMotionEventReceived(ev);
break;
}
return super.onTouchEvent(ev);
}
public void setMotionEventListener(MotionEventListener motionEventListener) {
this.motionEventListener = motionEventListener;
}
public interface MotionEventListener {
void onMotionEventReceived(MotionEvent motionEvent);
boolean isDragging();
boolean isZoomed();
}
}