Я пытался добиться того же эффекта, что и в этом вопросе. Я борюсь с этим, а затем я прочитал ответ @wnafee (я не мог этого сделать без него).
Но потом я изо всех сил пытаюсь реализовать то, что казалось довольно простым из ответа. У меня было так много проблем с его реализацией, что я мог неправильно понять ответ, но было слишком много проблем с недоступными API, поскольку я не работал в том же пакете библиотеки совместимости.
После того, как я попробовал несколько подходов (ни один из них не увенчался успехом, и они были довольно сложными), я пошел немного в другом направлении, и теперь он работает как шарм. Я использовал отражение, для тех, кто никогда не использовал его, не волнуйтесь, это действительно основа отражения.
Я не уверен, что это лучшее решение, но оно сработало для меня, поэтому, если вы хотите его использовать, милости просим. Пожалуйста, прочтите пример Wnafee, так как он объясняет некоторые вещи, которые я сделал.
Чтобы выполнить эту задачу, вам нужно просто следовать моему решению из трех частей. (Это займет от 3 до 10 минут)
Часть I.
Как сказал Wnafee, я только что создал свой собственный класс EdgeEffect, скопировав и вставив исходный код из здесь,
(просто не забудьте скопировать чертежи overscroll_edge и overscroll_glow в каталогах AOSP / res / drawable в свой собственный проект, поскольку они являются внутренними для Android)
Я сделал только 2 очень маленьких изменения:
- Я заявляю, что класс расширяет EdgeEffectCompat (я назвал свой класс
EdgeEffectForEarlyVersions
). public class EdgeEffectForEarlyVersions extends EdgeEffectCompat
. Причина внесения этого изменения в том, что mLeftEdge
и mRightEdge
относятся к типу EdgeEffectCompat
.
- В первой строке конструктора «моего» нового класса я добавил вызов родительского конструктора
super(context);
. Поскольку для EdgeEffectCompat
нет конструктора по умолчанию, вы должны явно вызвать конструктор.
Часть II
Кроме того, я написал еще одну функцию. Назначение функции состоит в том, чтобы в случае более ранней версии (до ICS) мы хотели бы использовать только что скопированный EdgeEffectForEarlyVersions
. Для достижения этой цели я использовал рефлексию.
Это функция:
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());
}
}
}
Часть III
Теперь все, что осталось сделать, - это вызвать эту функцию после того, как у вас будет экземпляр ViewPager, и не более того.
Надеюсь, это кому-то поможет.
person
nheimann1
schedule
11.08.2012