2014-12-07 2 views
19

over-scroll edge 및 over-scroll Glow의 색상을 변경하는 방법 또는 android release 5.0 lollipop의 흰색 색상 (기본 색상)을 변경하는 방법은 무엇입니까?overscroll edge 및 overscroll glow의 색상을 변경하는 방법

+0

[안드로이드 롤리팝있는 ScrollView 가장자리 효과 색상] (HTTP의 가능한 중복 : //stackoverflow.com/questions/27104521/android-lollipop-scrollview-edge-effect-color) – alanv

답변

37

overscroll 글로우 색상은 전체 앱에서 android:colorPrimary으로 설정된 기본 색상 값을 상속합니다. 그러나 다른 값을 지정해야하는 경우 android:colorEdgeEffect을 사용하면됩니다. LOLLIPOP에서

<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

에지 광선은 colorPrimary 상속. 뷰를 생성 한 후 에지 글로우 색상은 리플렉션을 통해서만 변경할 수 있습니다. Palette을 사용하여 색상을 동적으로로드 할 때 유용 할 수 있습니다.

편집 : TL; DR : 여기에서 전체 클래스를 다운로드 : https://github.com/consp1racy/android-commons/blob/master/commons/src/main/java/net/xpece/android/widget/XpEdgeEffect.java

난독 설정 : 당신이 지원 라이브러리에서 위젯에서이를 사용하려고하는 경우 당신은 필드 이름을 유지할 필요 . 그것을 할 수있는 가장 빠른 방법 인 (여전히 낭비 있지만) 다음

-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

Nice! 프로그래밍 방식으로 광선 색상을 변경하는 방법을 찾고 있었고 모든 대답은 xml에 스타일을 설정하는 것과 관련이있었습니다. 당신은 문제없이 나를 위해 일했고 이제는 statusbarcolor 및 툴바에 대한 컨텍스트에 따라 색상을 dinamycally 변경할 수 있습니다. 감사! – MrBrightside

+0

감사합니다. 그것은 잘 작동합니다. 그러나'RecyclerView'는 어떨까요? – sajad

+1

@sajad 다음은 대부분의 스크롤링 컨테이너를 처리하는 데 사용하는 클래스입니다. http://pastebin.com/TAujMUu9 유일하게 누락 된 것은 'HorizontalScrollView'입니다. –

관련 문제