2011-12-21 17 views
6

Ho pagine a scorrimento orizzontale come nel mercato Android (ViewPager).Scroll View orizzontale all'interno di ViewPager

Il mio problema è che voglio avere una vista a scorrimento orizzontale con alcune immagini?

Come ora, sto ottenendo un piccolo scorrimento nella mia vista e quindi l'intera pagina sta scorrendo.

Grazie per il vostro tempo!

+0

orologio [questo] risposta (http://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager). Ma invece di WebView personalizzato in quella risposta, potresti dover estendere il tuo HorizontalScrollingView. – grine4ka

risposta

0
<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      <ImageView1></ImageView> 
      <ImageView2></....> 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

Nel caso precedente, scrollVIew è applicabile solo per le due immagini non per l'edittext.

In altri casi:

<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      here listVIew with Images using listView adapter 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

Qui ScrollView è applicabile solo per ListView.

18

È necessario estendere gli eventi di tocco HorizontalScrollView e intercettare. Che cosa ha funzionato per me è stato il seguente esempio:

public class MyScrollView extends HorizontalScrollView { 

    public MyScrollView(Context p_context, AttributeSet p_attrs) 
    { 
     super(p_context, p_attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent p_event) 
    { 
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent p_event) 
    { 
     if (p_event.getAction() == MotionEvent.ACTION_MOVE && getParent() != null) 
     { 
      getParent().requestDisallowInterceptTouchEvent(true); 
     } 

     return super.onTouchEvent(p_event); 
    } 
} 

Poi, invece di utilizzare il HorizontalScrollView nel layout XML, è necessario utilizzare questa visualizzazione personalizzata.

Cosa mi ha aiutato a questa soluzione è this post

+0

Funziona per me, altre soluzioni no! Ma sembra che disabiliti la gestione dei clic sui pulsanti all'interno della tua scrollview personalizzata. Qualche idea? – user1365836

+0

@ user1365836 Sì ... può essere un po 'caotico ... Quello che ho fatto è stato usare getHitRect e trovare il pulsante esatto premuto e quindi chiamare la sua funzione onClick – Muzikant

+6

Se l'unica cosa che vuoi fare è consentire lo scorrimento ma permetti comunque l'utente a fare clic sugli elementi all'interno, devi solo controllare tutto da dentro suInterceptTouchEvent(). https://gist.github.com/brandondenney/b8ddd655664eb295129d – Brandon

1

ho rielaborato una soluzione e finalmente trovato un modo molto semplice da implementare allo stesso modo in cui è stato fatto su GMail: il HorizontalScrollView scorrerà fino a raggiungere una dei suoi bordi. Quindi al prossimo scorrimento, l'intera pagina scorrerà.

Tutto ciò che serviva era sovrascrivere HorizontalScrollView per controllare la direzione di scorrimento verso i bordi e assicurarsi che il contenuto potesse effettivamente scorrere.

@Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    if (no_scrolling) 
     return false; 

    // Standard behavior 
    // 
    return super.onTouchEvent(ev); 
} 

boolean no_scrolling = false; 
float old_x, old_y; 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    int action = ev.getActionMasked(); 
    Log.d(at_data.TAG, "HSV scroll intercept: " + String.format("0x%08x", action)); 

    if (action == MotionEvent.ACTION_DOWN) 
    { 
     old_x = ev.getX(); 
     old_y = ev.getY(); 
     no_scrolling = false; 

    } 
    else if (action == MotionEvent.ACTION_MOVE) 
    { 
     float dx = ev.getX() - old_x; 
     float dy = ev.getY() - old_y; 

     if (Math.abs(dx) > Math.abs(dy) && dx != 0) 
     { 
      View hsvChild = getChildAt(0); 
      int childW = hsvChild.getWidth(); 
      int W = getWidth(); 

      Log.d(at_data.TAG, "HSV " + childW + " > " + W + " ? dx = " + dx + " dy = " + dy); 
      if (childW > W) 
      { 
       int scrollx = getScrollX(); 
       if ((dx < 0 && scrollx + W >= childW) || (dx > 0 && scrollx <= 0)) 
       { 
        Log.d(at_data.TAG, "HSV Wider: on edge already"); 
        no_scrolling = true; 
        return false; 
       } 
       else 
       { 
        Log.d(at_data.TAG, "HSV Wider: can scroll"); 
        no_scrolling = false; 
       } 
      } 
      else 
      { 
       Log.d(at_data.TAG, "HSV cannot scroll in desired direction"); 
       no_scrolling = true; 
      } 
     } 
    } 

    // Standard behavior 
    // 
    return super.onInterceptTouchEvent(ev); 
} 
Problemi correlati