2011-01-13 95 views
14

我有一個派生自Android的默認燈光主題的主題。我的ListViews被配置爲白色背景,我認爲這是一個副作用,漸變邊緣的顏色是白色的,這不是我想要的 - 我希望它們是黑色的。控制ListViews中的衰落邊緣的顏色

簡單地改變邊緣的顏色似乎是不可能的(儘管我可以控制長度和其他因素),並且當使用黑色的ListView提示顏色時,通常會建議使用黑色來產生一些非常糟糕的副作用列表滾動。

任何人都可以建議一個可靠的方法,將漸變邊緣的顏色改變爲任意顏色嗎?

回答

18

不幸的是,你不能輕鬆做到這一點。衰落邊緣的全部點是淡入背景,而不是畫出一些隨機的顏色。但是,您可以嘗試擴展ListView並覆蓋getSolidColor()以返回所需的漸變邊緣顏色。它應該工作得很好。

+0

我有這個工作,但作爲方法顧名思義,信號衰減區域內並沒有你把顏色的alpha迴應 – 2012-11-26 11:02:57

34

這實際上要容易得多。

您可以使用'android:cacheColorHint'設置將淡入淡出的顏色更改爲任何想要的顏色。

如:

<ListView 
.... 
android:cacheColorHint="#FFFFFF" 
/> 
+0

我的設置是透明的,其結果是邊緣不會消失。你可以繞過嗎? – 2012-11-06 15:11:55

10

我有問題,白色是「Overscroll」的顏色,而不是實際的衰落邊緣。

試試這個(假設你想有一個衰落的邊緣,而不是可怕的白色強光,當你打的結束(否則設置要求的衰落邊緣無)!):

<ListView 
    android:id="@+id/listview" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:cacheColorHint="#00000000" 
    android:requiresFadingEdge="vertical" 
    android:fadingEdgeLength="10dp" 
    android:overScrollMode="never" >  </-- this is the line you want i think --> 
</ListView> 
1

如果你指的是「邊緣發光/效應」,我發現了一個很簡單的(但hackish的)的方式來做到這一點(改變輝光的顏色):

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

我注意到一個事實,即發光效果實際上是一個可繪製的優勢(與在那個un-mutate),並在其上應用一個過濾器。 更多一點,在這裏:http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

你可以改變EdgeEffect顏色ListViewGridView使用反射的。下面的靜態工廠方法複製到您的項目並使用setEdgeGlowColor(yourListView, yourAwesomeColor);

public static void setEdgeGlowColor(AbsListView listView, int color) { 
    try { 
     Class<?> clazz = AbsListView.class; 
     Field fEdgeGlowTop = clazz.getDeclaredField("mEdgeGlowTop"); 
     Field fEdgeGlowBottom = clazz.getDeclaredField("mEdgeGlowBottom"); 
     fEdgeGlowTop.setAccessible(true); 
     fEdgeGlowBottom.setAccessible(true); 
     setEdgeEffectColor((EdgeEffect) fEdgeGlowTop.get(listView), color); 
     setEdgeEffectColor((EdgeEffect) fEdgeGlowBottom.get(listView), color); 
    } catch (Exception ignored) { 
    } 
} 

public static void setEdgeEffectColor(EdgeEffect edgeEffect, int color) { 
    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      edgeEffect.setColor(color); 
      return; 
     } 
     Field edgeField = EdgeEffect.class.getDeclaredField("mEdge"); 
     Field glowField = EdgeEffect.class.getDeclaredField("mGlow"); 
     edgeField.setAccessible(true); 
     glowField.setAccessible(true); 
     Drawable mEdge = (Drawable) edgeField.get(edgeEffect); 
     Drawable mGlow = (Drawable) glowField.get(edgeEffect); 
     mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
     mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
     mEdge.setCallback(null); // free up any references 
     mGlow.setCallback(null); // free up any references 
    } catch (Exception ignored) { 
    } 
}