2011-01-13 3 views
14

У меня есть тема, которая основана на стандартной теме Android по умолчанию. Мои списки ListView настроены с белым фоном, и я предполагаю, что это побочный эффект, цвет затухающего края белый, что не то, что я хочу - я бы хотел, чтобы они были черными.Управление цветом края затухания в ListViews

Кажется невозможным просто изменить цвет края (хотя я могу контролировать длину и другие факторы), и обычное предложение использовать черный цвет для цвета подсказки listview приводит к некоторым довольно ужасным побочным эффектам, когда список свитков.

Может ли кто-нибудь посоветовать надежный способ изменения цвета затухающего края на произвольный цвет?

ответ

18

К сожалению, вы не можете сделать это легко. Вся точка затухающих краев должна затухать в фоновом режиме, а не рисовать какой-то случайный цвет. Тем не менее, вы можете попытаться расширить ListView и переопределить getSolidColor(), чтобы вернуть цвет, который вы хотите для краев затухания. Он должен работать нормально.

+0

Я имел эту работу, но, как следует из названия метода, замирание область не реагирует на альфа цвета вы положили в –

34

На самом деле это намного проще.

Вы можете изменить цвет выцветания на все, что хотите, используя настройку «android: cacheColorHint».

например:

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

У меня установлено мое прозрачное, вследствие чего края вообще не исчезают. Можете ли вы обойти это? –

+1

Прозрачный на самом деле имеет смысл, и вы думаете, что это будет по умолчанию, но из-за того, как он реализован (в котором применяется оверлей указанного цвета) это невозможно. Лучше всего использовать цвет, который лучше всего напоминает ваш фон или, возможно, даже прозрачный, является лучшим решением. – Scott

+0

Нет, это прозрачно без проблем, но теперь у меня нет затухающих краев. –

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

Если вы имеете в виду «край свечение/эффект», я нашел очень простой (но хак) способ сделать это (изменение цвета свечения):

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

Я воспользовался тем, что эффектом свечения является фактически Drawable (и un-mutate при этом) и наложил на него фильтр. Подробнее об этом здесь: http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

3

Вы можете изменить EdgeEffect цвет ListView или GridView с помощью отражения. Скопируйте следующие статические фабричные методы в свой проект и использовать 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) { 
    } 
} 
Смежные вопросы