10

私は、ListView基本的にホロに似ているが、青ではなく黄色のアクセントが付いたカスタムスタイルを持っています。

リストの一番下または一番上までスクロールすると、フィットしない青が表示されます。overscroll_glow.pngとのカスタムドローアブルを作成しましoverscroll_edge.pngたが、使い方がわかりません。

ListViewシステムのドローアブルの代わりにこれらのドローアブルを使用するにはどうすればよいですか?

OverScrollerクラスは役に立ちますか?

4

6 に答える 6

8

反射のようなソリューションを使用して、このグローの色を変更する方法をハックできます。

int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android");
Drawable androidGlow = context.getResources().getDrawable(glowDrawableId);
androidGlow.setColorFilter(brandColor, PorterDuff.Mode.MULTIPLY);

私は同じ問題に遭遇しましたが、少なくともGoogleが色を変更する(または色をブランディングする)ためのAPIを追加するまでは、良い解決策のようです:http://evendanan.net/android/branding/2013/12/09/ブランディングエッジ効果/

于 2013-12-09T19:22:55.153 に答える
5

このライブラリを使用するだけです。オーバースクロールのないデバイス (HTC One X/Sense 4.5) で横向きのポップアップ メニューのコンテキストをラップする際に問題が発生しただけです。魔法のように動作します!

https://github.com/AndroidAlliance/EdgeEffectOverride

于 2013-08-02T21:18:27.810 に答える
4

これを試しましたか?setOverscrollFooter(Drawable) ?

更新 1 :

おっとっと。どうでも。おそらく、この議論はすでに見たことがあるでしょう。

グロー動作はEdgeEffect クラスにラップされています。setOverScrollMode(OVER_SCROLL_NEVER)ListView を呼び出してから、独自の EdgeEffect クラスをロールすることで、デフォルトのエッジ効果を無効にすることができます (詳細はこの時点ではわかりません)。

更新 2 :

ああ。AbsListView 内で作成された EdgeEffect オブジェクトの呼び出しは、スクロール ロジックの奥深くに埋め込まれています。厳しいかもしれません。setEdgeEffect(EdgeEffect)簡単な修正は、AbsListViewのメソッドの Android チームへの機能リクエストです...

于 2012-08-24T01:39:38.783 に答える
3

オーバースクロールのエッジラインを変更することを忘れないでください:

        final int edgeDrawableId = res.getIdentifier("overscroll_edge", "drawable", "android");
        final Drawable overscrollEdge = res.getDrawable(edgeDrawableId);
        overscrollEdge.setColorFilter(res.getColor(colorID), android.graphics.PorterDuff.Mode.SRC_ATOP);
于 2015-03-25T14:23:33.283 に答える
3

ここに解決策があります:

public static void ChangeEdgeEffect(Context cxt, View list, int color){

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        EdgeEffect edgeEffectTop = new EdgeEffect(cxt);
        edgeEffectTop.setColor(color);
        EdgeEffect edgeEffectBottom = new EdgeEffect(cxt);
        edgeEffectBottom.setColor(color);

        try {
            Field f1 = AbsListView.class.getDeclaredField("mEdgeGlowTop");
            f1.setAccessible(true);
            f1.set(list, edgeEffectTop);

            Field f2 = AbsListView.class.getDeclaredField("mEdgeGlowBottom");
            f2.setAccessible(true);
            f2.set(list, edgeEffectBottom);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }else{
        int glowDrawableId = cxt.getResources().getIdentifier("overscroll_glow", "drawable", "android");
        Drawable androidGlow = cxt.getResources().getDrawable(glowDrawableId);
        assert androidGlow != null;
        androidGlow.setColorFilter(cxt.getResources().getColor(color), PorterDuff.Mode.SRC_ATOP);
    }
}
于 2015-02-11T09:23:16.157 に答える
0

これはトピックに関する上位の結果の 1 つであり、上位の回答はもはや正しくないため、この回答を追加します。まあ、実際にはロリポップ前のバージョンですが、予想通り、Javaリフレクションを使用すると噛み返されます。コードを使用すると、それが起こりました

int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android");
Drawable androidGlow = context.getResources().getDrawable(glowDrawableId);
androidGlow.setColorFilter(context.getResources().getColor(R.color.gm_color), PorterDuff.Mode.MULTIPLY);

そのリソースがもう存在しないため、これは Lollipop + デバイスでクラッシュします。したがって、Android 5.+ の場合は、次を使用する必要があります。

       <item name="android:colorEdgeEffect">@color/custom_color</item>

values-v21/themes.xmlテーマで、最小 21 バージョンを対象としていない場合はファイルでオーバーライドされます

于 2015-01-22T15:50:27.653 に答える