2015-09-03 10 views
15

Ho un ViewPager che sta visualizzando pagine di Frammenti. Ogni frammento è una WebView che sta visualizzando un sito Web offline. Alcune di queste visualizzazioni web hanno eventi di scorrimento javascript in loro per farle funzionare.L'evento di tocco di arresto viene intercettato da ViewPager se è presente un evento di tocco nella visualizzazione Web

Mi piacerebbe implementare in modo tale che se la webview non ha eventi di scorrimento (all'interno del javascript), quindi l'evento di tocco viene passato allo ViewPager, se non viene consumato dalla webview.

Ho provato sovrascrivendo i ViewPagers

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) 
{ 
    return (this.swipeable) ? super.onInterceptTouchEvent(event) : false; 
} 

Tuttavia questo impediva la ViewPager dall'essere a scorrimento (come previsto), ma anche fermato l'evento magnetica raggiungere la WebView, quindi ho due risultati desiderati.

Esiste un modo per passare prima l'evento tattile a WebView, quindi se non viene utilizzato nel frammento restituendolo allo ViewPager?

Nel caso in cui ho fatto un errore nel mio MyViewPager Ho il codice:

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; 
} 

}

risposta

8

ho avuto ora due soluzioni per questo problema sul stava estendendo la classe ViewPager e sovrascrivendo il

public boolean onInterceptTouchEvent(MotionEvent event) 
{ 
    // code 
} 

tuttavia una soluzione molto migliore è stato quello di ignorare il

protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
    return true; 
} 

per completezza qui è tutta la classe

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; 
} 
} 

Speranza che aiuta qualcun altro

Problemi correlati