2014-12-07 1 views
19

Как изменить цвет края сверхпрокрутки и сверхпрокрутки или как изменить белый цвет (цвет по умолчанию) версии android release lollipop?Как изменить цвет края прокрутки и затухания прокрутки

+0

возможно дубликат [андроида леденец Scrollview Краевой эффект цвет] (HTTP: //stackoverflow.com/questions/27104521/android-lollipop-scrollview-edge-effect-color) – alanv

ответ

37

Цвет свечения прокрутки наследует основное значение цвета, заданное android:colorPrimary во всем приложении. Но если вам нужно указать другое значение, просто используйте android:colorEdgeEffect.

<style name="MyAppTheme" parent="***"> 
    <item name="android:colorEdgeEffect">@color/my_color</item> 
</style> 
+0

Этот атрибут доступен только для API 21 и выше. – fractalwrench

+0

Да вот в чем вопрос. –

+3

Обратите внимание, что 'android: colorPrimary' также устанавливает цвет вашего ActionBar или панели инструментов. В то время как 'android: colorEdgeEffect' более специфичен и применим только к ListViews, RecyclerViews и т. Д. –

22

На LOLLIPOP край свечение наследует от colorPrimary. После создания представления цвет свечения края может быть изменен только через отражение. Это может быть полезно, когда вы динамически загружаете цвета, используя Palette.

EDIT: TL; DR: Скачать весь класс здесь: https://github.com/consp1racy/android-commons/blob/master/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java

Proguard SETUP: Если вы собираетесь использовать это на виджетах из библиотеки поддержки вам нужно сохранить имена полей , Быстрый способ сделать это состоит в следующем (хотя по-прежнему расточительно):

-keepclassmembers class * extends android.view.View { 
    <fields>;  
} 

-keepclassmembers class android.support.v4.widget.EdgeEffectCompat { 
    <fields>;  
} 

Создать служебный класс со следующим кодом:

private static final Class<?> CLASS_SCROLL_VIEW = ScrollView.class; 
private static final Field SCROLL_VIEW_FIELD_EDGE_GLOW_TOP; 
private static final Field SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM; 

private static final Class<?> CLASS_LIST_VIEW = AbsListView.class; 
private static final Field LIST_VIEW_FIELD_EDGE_GLOW_TOP; 
private static final Field LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM; 

static { 
    Field edgeGlowTop = null, edgeGlowBottom = null; 

    for (Field f : CLASS_SCROLL_VIEW.getDeclaredFields()) { 
    switch (f.getName()) { 
     case "mEdgeGlowTop": 
     f.setAccessible(true); 
     edgeGlowTop = f; 
     break; 
     case "mEdgeGlowBottom": 
     f.setAccessible(true); 
     edgeGlowBottom = f; 
     break; 
    } 
    } 

    SCROLL_VIEW_FIELD_EDGE_GLOW_TOP = edgeGlowTop; 
    SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM = edgeGlowBottom; 

    for (Field f : CLASS_LIST_VIEW.getDeclaredFields()) { 
    switch (f.getName()) { 
     case "mEdgeGlowTop": 
     f.setAccessible(true); 
     edgeGlowTop = f; 
     break; 
     case "mEdgeGlowBottom": 
     f.setAccessible(true); 
     edgeGlowBottom = f; 
     break; 
    } 
    } 

    LIST_VIEW_FIELD_EDGE_GLOW_TOP = edgeGlowTop; 
    LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM = edgeGlowBottom; 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public static void setEdgeGlowColor(AbsListView listView, int color) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    try { 
     EdgeEffect ee; 
     ee = (EdgeEffect) LIST_VIEW_FIELD_EDGE_GLOW_TOP.get(listView); 
     ee.setColor(color); 
     ee = (EdgeEffect) LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(listView); 
     ee.setColor(color); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public static void setEdgeGlowColor(ScrollView scrollView, int color) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    try { 
     EdgeEffect ee; 
     ee = (EdgeEffect) SCROLL_VIEW_FIELD_EDGE_GLOW_TOP.get(scrollView); 
     ee.setColor(color); 
     ee = (EdgeEffect) SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(scrollView); 
     ee.setColor(color); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 
+1

Ницца! Я искал способ изменения цвета свечения программно, и каждый ответ был связан с настройкой стиля на xml. Твоя работала для меня без проблем, и теперь я могу изменить цвет динамически в зависимости от контекста, как я делаю для statusbarcolor и панели инструментов. Благодаря! – MrBrightside

+0

спасибо. он работает хорошо. но как насчет 'RecyclerView'? – sajad

+1

@sajad Вот класс, который я использую для обработки большинства прокручиваемых контейнеров. Http://pastebin.com/TAujMUu9 Единственное, что отсутствует, это 'HorizontalScrollView', я думаю. –

 Смежные вопросы

  • Нет связанных вопросов^_^