Остановить событие touch от перехвата ViewPager, если в веб-просмотре есть событие touch
У меня есть ViewPager
, на котором отображаются страницы фрагментов. Каждый фрагмент - это WebView, который отображает автономный веб-сайт. Некоторые из этих веб-просмотров имеют javascript-салфетки в них, чтобы заставить их работать.
Я хотел бы реализовать такое, что если веб-просмотр не имеет события салфетки (внутри javascript), то событие touch передается до ViewPager
, если оно не потребляется веб-просмотром.
Я попытался переопределить ViewPagers
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
return (this.swipeable) ? super.onInterceptTouchEvent(event) : false;
}
Однако это не позволяло ViewPager
быть прокручиваемым (как ожидалось), но также остановило событие салфетки, достигающее веб-представления, поэтому у меня есть два нежелательных результата.
Есть ли способ передать событие касания к webView сначала, если он не будет использоваться в фрагменте, передав его обратно в ViewPager
?
Если я допустил ошибку в моем MyViewPager
, у меня есть код:
public class MyViewPager extends ViewPager implements GestureDetector.OnGestureListener
{
private static final String TAG = MyViewPager.class.getSimpleName();
private boolean swipeable = true;
private float lastX = 0;
private long lastTime = 0 ;
private GestureDetector mGestureDetector;
private boolean mScrolling = false;
public MyViewPager(Context context) {
super(context);
mGestureDetector = new GestureDetector(context, this);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, this);
}
public void setSwipeable(boolean swipeable) {
this.swipeable = swipeable;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
/* float speed = 0;
if(event.getAction() == MotionEvent.ACTION_MOVE)
{
if(lastX!=0) {
speed = (event.getRawX()- lastX) / (System.currentTimeMillis()-lastTime);
if(speed < 0.0 ){speed *=-1;}
Log.e(TAG, "Move at speed ->"+speed);
if(speed >0.5){return false;}
}
lastX = event.getRawX();
lastTime = System.currentTimeMillis();
return true;
}*/
// return true;
return (this.swipeable) ? super.onInterceptTouchEvent(event) : false;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
Log.i(TAG, "onTouch event");
// mGestureDetector.onTouchEvent(event);
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velX, float velY) {
Log.i(TAG, "flinging");
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distX, float distY)
{
float displacement = distX;
return false;
}
// Unused Gesture Detector functions below
@Override
public boolean onDown(MotionEvent event) {
return false;
}
@Override
public void onLongPress(MotionEvent event) {
// we don't want to do anything on a long press, though you should probably feed this to the page being long-pressed.
}
@Override
public void onShowPress(MotionEvent event) {
// we don't want to show any visual feedback
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
// we don't want to snap to the next page on a tap so ignore this
return false;
}
}
Ответы
Ответ 1
У меня есть два решения этой проблемы: расширение класса ViewPager и переопределение
public boolean onInterceptTouchEvent(MotionEvent event)
{
// code
}
Однако гораздо лучшим решением было переопределить
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
return true;
}
для полноты здесь есть весь класс
public class ZoltansViewPager extends ViewPager {
private static final String TAG = ZoltansViewPager.class.getSimpleName();
private boolean swipeable = true;
private float lastX = 0;
private long lastTime = 0 ;
private GestureDetector mGestureDetector;
private boolean mScrolling = false;
public ZoltansViewPager(Context context) {
super(context);
}
public ZoltansViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setSwipeable(boolean swipeable) {
this.swipeable = swipeable;
}
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
Log.i(TAG , " boolean checkV ->"+checkV + ", int dx-> "+dx+", int x->"+x+", int y->"+y);
if(x <300 || x >1700 ){return true;}
return false;
}
}
надеюсь, что это поможет кому-то еще