Ich habe versucht, um genau den gleichen Effekt zu erzielen, der in dieser Frage gestellt wurde. Ich kämpfe damit und dann lese ich @ wnafee antwort (ich konnte es nicht mit raus machen).
Aber dann habe ich Mühe zu implementieren, was klang ziemlich einfach aus der Antwort. Ich hatte so viele Probleme mit der Implementierung, dass ich die Antwort vielleicht nicht richtig verstanden habe, aber es gab zu viele Probleme mit nicht zugänglichen APIs, da ich nicht im selben Paket der Kompatibilitätsbibliothek arbeitete.
Nachdem ich einige Ansätze versucht hatte (keine von ihnen gelungen, und sie waren ziemlich kompliziert) ging ich in eine etwas andere Richtung, und jetzt funktioniert es wie ein Charme. Ich habe einige Überlegungen angestellt, für diejenigen, die es nie benutzt haben, mach dir keine Sorgen, es ist wirklich die Grundlage der Reflexion.
Ich bin nicht sicher, ob es die beste Lösung da draußen ist, aber es hat für mich funktioniert, also wenn Sie es verwenden möchten, sind Sie willkommen. Bitte lesen Sie das Wnafee-Beispiel, da es einige der Dinge erklärt, die ich gemacht habe.
Um diese Aufgabe zu erfüllen, sollten Sie nur meine drei Teile Lösung folgen. (Werden Sie zwischen 3-10 Minuten)
Teil I:
Wie Wnafee sagte ich meine eigene EdgeEffect Klasse nur durch Kopie gemacht, den Quellcode von here einfügen,
(nur stellen sie sicher, die overscroll_edge zu kopieren und overscroll_glow Drawables in den AOSP/res/ziehbar Verzeichnisse Ihr eigenes Projekt , da sie zu android intern sind)
Ich habe nur zwei wirklich kleine Änderungen:
- Ich erkläre, dass die Klasse erweitert EdgeEffectCompat (ich meine Klasse
EdgeEffectForEarlyVersions
genannt). public class EdgeEffectForEarlyVersions extends EdgeEffectCompat
. Der Grund für diese Änderung ist, dass die mLeftEdge
und mRightEdge
vom Typ EdgeEffectCompat
sind.
- In der ersten Zeile des Konstruktors von "meine" neue Klasse habe ich einen Aufruf an den übergeordneten Konstruktor
super(context);
hinzugefügt. Da es keinen Standardkonstruktor für EdgeEffectCompat
gibt, müssen Sie den Konstruktor explizit aufrufen.
Teil II
Außerdem schrieb ich eine andere Funktion. Der Zweck der Funktion ist, dass wir im Falle einer frühen Version (vor ICS) die EdgeEffectForEarlyVersions
verwenden möchten, die wir gerade kopiert haben. Um diesen Zweck zu erreichen, habe ich nachgedacht.
Dies ist die Funktion:
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());
}
}
}
Teil III
Jetzt alles, was es zu tun bleibt, ist, dass die Funktion aufrufen, nachdem Sie die ViewPager Instanz und nichts mehr haben.
Ich hoffe, es wird jemandem helfen.
Das ist nicht das, was er hat gefragt. Er wollte genau wissen, wie man einen Overscroll-Effekt wie das Gummiband auf iOS macht, das in ViewPager zumindest bis ICS fehlt. –