8

parece que Samsung deshabilitado su Permitir desplazamiento (probablemente debido a una demanda de Apple).Samsung Galaxy S2 2.3.5+ no llamar overScrollBy()

tengo una implementación de una vista que se extiende ScrollView y anula

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

En cualquier otro dispositivo (pan de jengibre y hasta, por supuesto), overScrollBy se está llamando cuando el desplazador llega a su fin, y el usuario puede en realidad sobredesplazamiento de la vista).

En Android 2.3.5+ Samsung implementó algún tipo de mecanismo que deshabilita el desbordamiento total (no solo su implementación de desbordamiento, sino también la implementación de Android), y cada vez que un usuario intenta sobrescribir, se imprime el siguiente evento LogCat :

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

¿Hay alguna manera de desbloquear lo que Samsung hizo allí? ¿O tal vez otra forma de crear un overscroller?

+0

... alternativa a continuación por el violinista funciona ... – Houston

Respuesta

3

Problema resuelto, he creado mi propia OverScrollView, que pueden hacer uso de ella. https://github.com/EverythingMe/OverScrollView

+0

Cualquier posibilidad de que podría solucionar este problema hasta trabajar para listviews así? – VicVu

+0

ListView es una vista más complicado, el mismo parche no debe aplicarse para ello, aunque voy a actualizar si tengo alguna noticia. – Rotemmiz

+0

Eso sería genial, gracias. – VicVu

3

acabo enfrentan el mismo problema y, finalmente, se le ocurrió la siguiente detección personalizada Permitir desplazamiento:

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

Voy a intentar esto en su debido tiempo. – VicVu

+0

funciona como un encanto ... muy bien hecho. ¡Gracias, violinista! – Houston

Cuestiones relacionadas