yo estaba tratando para obtener exactamente el mismo efecto que se hizo en esta pregunta. Lucho con eso y luego leo @wnafee answer (no podría hacerlo sin él).
Pero luego me cuesta implementar lo que es bastante simple por la respuesta. Tuve tantos problemas con su implementación, que quizás no entendía la respuesta correctamente, pero había demasiados problemas con las API inaccesibles, ya que no estaba trabajando en el mismo paquete de la biblioteca de compatibilidad.
Después de probar algunos enfoques (ninguno de ellos tuvo éxito, y fueron bastante complicados) fui en una dirección ligeramente diferente, y ahora funciona como un encanto. Usé un reflejo, para los que nunca lo usaron, no se preocupen, es realmente el básico de la reflexión.
No estoy seguro de si es la mejor solución que existe, pero funcionó para mí, así que si desea utilizarla, puede hacerlo. Por favor, lea el ejemplo de Wnafee ya que explica algunas de las cosas que hice.
Para realizar esta tarea, simplemente debe seguir mi solución de tres partes. (Tendrá que tomar entre 3-10 minutos)
Parte I:
Como Wnafee dijo que acabo de hacer mi propia clase EdgeEffect por copiar y pegar el código fuente de la here,
(solo asegúrese de copiar el overscroll_edge y overscroll_glow dibujables en los directorios/res/dibujable AOSP a su propio proyecto ya que son internos al androide)
Sólo hice 2 muy pequeños cambios:
- Declaro que la clase extiende EdgeEffectCompat (llamé a mi clase
EdgeEffectForEarlyVersions
). public class EdgeEffectForEarlyVersions extends EdgeEffectCompat
. La razón para hacer este cambio es que mLeftEdge
y mRightEdge
son del tipo EdgeEffectCompat
.
- En la primera línea del constructor de "mi" nueva clase, agregué una llamada al constructor padre
super(context);
. Como no existe un constructor predeterminado para EdgeEffectCompat
, debe llamar explícitamente al constructor.
Parte II
Además de eso escribí la otra función. El objetivo de la función es que, en el caso de una versión anterior (antes de ICS), nos gustaría utilizar el EdgeEffectForEarlyVersions
que acabamos de copiar. Para lograr ese propósito, usé la reflexión.
Ésta es la función:
private static void changeEdgeEffectCompactOnEarlyVersions(ViewPager viewPager, Context context)
{
/* In case that the version is earlier than 14 there is only empty implementation for the edge effect, therefore we change it.
* for more information look on the following links:
* 1. http://stackoverflow.com/questions/10773565/visual-indication-of-over-scroll-in-android
* 2. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/view/ViewPager.java#ViewPager.0mLeftEdge
* 3. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/widget/EdgeEffectCompat.java#EdgeEffectCompat
*/
if (Build.VERSION.SDK_INT < 14)
{
try
{
Class<ViewPager> viewPagerClass = ViewPager.class;
//Get the left edge field, since it is private we used getDeclaredField and not getDeclared
Field leftEdge = viewPagerClass.getDeclaredField("mLeftEdge");
leftEdge.setAccessible(true);
//Get the right edge field, since it is private we used getDeclaredField and not getDeclared
Field rightEdge = viewPagerClass.getDeclaredField("mRightEdge");
rightEdge.setAccessible(true);
EdgeEffectForEarlyVersions leftEdgeEffect = new EdgeEffectForEarlyVersions(context);
EdgeEffectForEarlyVersions rightEdgeEffect = new EdgeEffectForEarlyVersions(context);
//Set the mLeftEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect
leftEdge.set(viewPager, leftEdgeEffect);
//Set the mRightEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect
rightEdge.set(viewPager, rightEdgeEffect);
}
catch (Exception ex)
{
Log.e("refelection", ex.getMessage());
}
}
}
Parte III
Ahora todo lo que queda por hacer, es llamar a esa función después de que la instancia se ViewPager y nada más.
Espero que ayude a alguien.
Eso no era lo preguntó. Quería saber específicamente cómo hacer un efecto de desbordamiento como la goma elástica en iOS, que falta en ViewPager al menos hasta ICS. –