2011-01-13 31 views
14

Tôi có một chủ đề xuất phát từ chủ đề ánh sáng mặc định của Android. ListView của tôi được cấu hình với nền màu trắng, và tôi đoán là tác dụng phụ của điều này, màu của cạnh mờ dần là màu trắng, không phải thứ tôi muốn - tôi muốn chúng có màu đen. Có vẻ như không thể thay đổi màu sắc của cạnh (mặc dù tôi có thể kiểm soát độ dài và các yếu tố khác), và gợi ý thông thường sử dụng màu đen cho màu gợi ý của listview sẽ dẫn đến một số tác dụng phụ khá khủng khiếp khi danh sách cuộn.Kiểm soát màu của cạnh mờ dần trong ListViews

Có ai có thể tư vấn cho một cách đáng tin cậy để thay đổi màu sắc của cạnh mờ dần thành màu tùy ý không?

Trả lời

18

Rất tiếc, bạn không thể thực hiện việc này một cách dễ dàng. Toàn bộ điểm của các cạnh phai mờ dần mờ dần vào nền, không vẽ màu ngẫu nhiên. Tuy nhiên, bạn có thể thử mở rộng ListView và ghi đè getSolidColor() để trả lại màu bạn muốn cho các cạnh mờ dần. Nó sẽ hoạt động tốt.

+0

Tôi đã có công việc này, nhưng như tên phương pháp cho thấy, khu vực mờ dần không đáp ứng với các alpha của màu sắc mà bạn đưa vào –

34

Nó thực sự dễ dàng hơn nhiều sau đó.

Bạn có thể thay đổi màu của phai thành bất kỳ thứ gì bạn muốn bằng cách sử dụng cài đặt: 'android: cacheColorHint'.

ví dụ:

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

Tôi đã thiết lập của tôi để minh bạch, với hệ quả là các cạnh không phai mờ chút nào. Bạn có thể làm tròn cái này không? –

+1

Minh bạch sẽ thực sự có ý nghĩa nhất và bạn sẽ nghĩ rằng đó thực sự là mặc định nhưng do cách nó được thực hiện (trong đó nó áp dụng một lớp phủ của màu sắc quy định) điều này là không thể. Đặt cược tốt nhất của bạn là sử dụng một màu phù hợp nhất với nền của bạn hoặc thậm chí là có màu trong suốt là giải pháp tốt nhất. – Scott

+0

Không, nó đang sử dụng trong suốt mà không có vấn đề gì, nhưng bây giờ tôi không có các cạnh mờ dần. –

10

Tôi gặp vấn đề màu trắng là màu "Overscroll", không thực sự là cạnh mờ dần.

thử này (giả sử bạn muốn có một cạnh mờ dần, nhưng không phải là chói trắng khủng khiếp khi bạn nhấn kết thúc (nếu không thiết đòi hỏi phai cạnh không ai sánh kịp)!):

<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

Nếu bạn có nghĩa là "cạnh sáng/hiệu lực thi hành", tôi tìm thấy một cách rất đơn giản (nhưng hackish) để thực hiện điều này (thay đổi màu sắc của ánh sáng):

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

tôi đã tận dụng thực tế là hiệu ứng ánh sáng thực sự là một drawable (và un-mutate lúc đó), và áp dụng một bộ lọc trên đó. Thông tin thêm về nó, ở đây: http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

Bạn có thể thay đổi màu sắc của EdgeEffect một sự phản ánh ListView hoặc GridView sử dụng. Sao chép các phương pháp nhà máy tĩnh sau vào dự án của bạn và sử dụng 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) { 
    } 
} 
Các vấn đề liên quan