8

Sembra che Samsung abbia disabilitato il loro overscroll (probabilmente a causa di un abito Apple).Samsung Galaxy S2 2.3.5+ non chiama overScrollBy()

Ho un'implementazione di una vista che si estende ScrollView e sovrascrive

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY,int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 
    { 
    ... 
    return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, 0, metrics.widthPixels,isTouchEvent); 
    } 

Su ogni altro dispositivo (Gingerbread e fino ovviamente), overScrollBy viene chiamato quando lo scroller raggiunge il suo fine, e l'utente può in realtà sovrascrive la vista).

Su Android 2.3.5+ Samsung ha implementato un tipo di meccanismo che disabilita completamente l'overscroll (non solo la loro implementazione di overscroll, ma anche l'implementazione di Android) e ogni volta che un utente tenta di eseguire l'overscroll, viene stampato il seguente evento LogCat :

02-13 16:02:34.230: D/BounceScrollRunnableDefault(15783): run(), TimeFraction=0.5225, mBounceExtent=7.273352 

C'è un modo per sbloccare ciò che Samsung ha fatto? O forse un altro modo per creare un overscroller?

+0

... alternativa dal violinista in basso funziona ... – Houston

risposta

3

Problema risolto, ho creato la mia OverScrollView, siete invitati a usarlo. https://github.com/EverythingMe/OverScrollView

+0

Qualche possibilità di risolvere il problema anche per ListViews? – VicVu

+0

ListView è una vista più complicata, la stessa patch non verrà applicata per questo, anche se aggiornerò se avrò notizie. – Rotemmiz

+0

Sarebbe fantastico, grazie. – VicVu

3

ho appena affrontato lo stesso problema e, infine, si avvicinò con la seguente rilevazione Overscroll personalizzato:

listView.setOnTouchListener(new OnTouchListener() { 

     private static final float OVERSCROLL_THRESHOLD_IN_PIXELS = 70; 

     private float downY; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int firstVisibleItem = listView.getFirstVisiblePosition(); 
      int totalItemCount = listView.getCount(); 
      int visibleItemCount = listView.getChildCount(); 
      boolean onTop = firstVisibleItem == 0 && listView.getChildAt(0) != null && listView.getChildAt(0).getTop() == 0; 
      boolean onBottom = firstVisibleItem + visibleItemCount == totalItemCount && listView.getChildAt(visibleItemCount-1).getBottom() == listView.getHeight(); 

      if(onTop || onBottom) { 
       switch(event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        downY = event.getY(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        float deltaY = event.getY() - downY; 
        if(onTop && deltaY > OVERSCROLL_THRESHOLD_IN_PIXELS) { 
         // Top overscroll 
        } 
        if(onBottom && -deltaY > OVERSCROLL_THRESHOLD_IN_PIXELS) { 
         // Bottom overscroll 
        } 
        break; 
       } 
      } 

      return false; 
     } 
    }); 
+0

Lo proverò a tempo debito. – VicVu

+0

funziona come un incantesimo ... molto ben fatto. Grazie violinista! – Houston

Problemi correlati