私はこの質問で尋ねられたのとまったく同じ効果を得ようとしていました。私はそれに苦労し、それから@wnafeeの答えを読みました(私はそれなしではそれを行うことができませんでした)。
しかし、それから私は答えからかなり単純に聞こえるものを実装するのに苦労します。実装に非常に苦労したため、答えが正しく理解できなかった可能性がありますが、互換性ライブラリの同じパッケージで作業していなかったため、アクセスできないAPIの問題が多すぎました。
いくつかのアプローチを試した後(どれも成功せず、かなり複雑でした)、少し異なる方向に進みましたが、今ではそれは魅力のように機能します。私はいくつかの反射を使用しました、それを使用したことがない人のために、それが本当に反射の基本であることを心配しないでください。
それが最善の解決策であるかどうかはわかりませんが、私にとってはうまくいったので、それを使用したい場合は大歓迎です。私がやったことのいくつかを説明しているので、Wnafeeの例を読んでください。
このタスクを実行するには、私の3つの部分からなるソリューションに従う必要があります。(3〜10分かかります)
パートI:
Wnafeeが言ったように、ここからソースコードをコピーして貼り付けて、独自のEdgeEffectクラスを作成しました。
(AOSP / res / drawableディレクトリのoverscroll_edgeおよびoverscroll_glowドローアブルは、Androidの内部にあるため、必ず自分のプロジェクトにコピーしてください)
私は2つの本当に小さな変更をしました:
- クラスがEdgeEffectCompatを拡張することを宣言します(私は自分のクラスを呼び出しました
EdgeEffectForEarlyVersions
)。public class EdgeEffectForEarlyVersions extends EdgeEffectCompat
。この変更を行う理由は、mLeftEdge
とmRightEdge
がタイプであるためEdgeEffectCompat
です。
- 「my」の新しいクラスのコンストラクターの最初の行で、親コンストラクターへの呼び出しを追加しました
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インスタンスを取得した後でその関数を呼び出すだけです。
私はそれが誰かを助けることを願っています。