2013-02-18 100 views
2

我想定製我的應用程序的Viewpager的EdgeEffect。目的是取代藍色的Overscroll EdgeEffect,即用一個自定義的紅色。所以起初我編輯overscroll_edge和相應的overscroll_glow。然後我把它們都放到我應用程序的/ res/drawable目錄中。此外,我複製EdgeEffect Source File到我的應用程序的/ src/android/widget /目錄。我在EdgeEffect中做的唯一改變是導入com.my.application.R而不是com.android.internal.R。的Android Viewpager EdgeEffect自定義顏色

但是Android所以Viewpager EdgeEffect保持不斷藍色是不會用我的自定義android.widget.EdgeEffect,而不是一個Android系統。我錯過了什麼嗎?

+0

我想你也需要讓自己的ViewPager類的副本,並使其ü選擇您的EdgeEffect對象而不是系統。 – FoamyGuy 2013-02-18 16:34:06

+0

好了,但如果我這樣做,我得到一個敏捷裝載機錯誤:多DEX文件定義Landroid /支持/ V4 /視圖/ ViewPager $裝飾; – 2013-02-18 16:39:43

+0

你需要把你的包裝放在你自己的包裏。和你的XML內引用它像'' – FoamyGuy 2013-02-18 16:41:06

回答

2

您必須實現ViewPagerPagerAdapterFragmentstatePagerAdapterEdgeEffectCompatEdgeEffectCompatIcsEdgeEffect在包裝自己的應用程序(例如com.yourapp.viewpager)的。只有更改是調整導入和包名稱。複製和編輯資源文件到您的應用程序的res/drawable等瞧,它的工作。

1

我可以提出一個很簡單的方法,但hackish的:

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

我注意到一個事實,即發光效果其實是一個共享的可繪製的優勢和應用上有一個過濾器:http://evendanan.net/android/branding/2013/12/09/branding-edge-effect/

+0

目前爲止,這似乎對我很有幫助。被接受的答案要求做很多無聊的工作,最多的被選爲反思,所以這個雖然是駭人聽聞的,但卻是最不好的一個。 – 2016-08-26 14:49:28

7

你可以設置EdgeEffect顏色ViewPager的一些反思:

public static void setEdgeGlowColor(ViewPager viewPager, int color) { 
    try { 
     Class<?> clazz = ViewPager.class; 
     for (String name : new String[] { 
       "mLeftEdge", "mRightEdge" 
     }) { 
      Field field = clazz.getDeclaredField(name); 
      field.setAccessible(true); 
      Object edge = field.get(viewPager); // android.support.v4.widget.EdgeEffectCompat 
      Field fEdgeEffect = edge.getClass().getDeclaredField("mEdgeEffect"); 
      fEdgeEffect.setAccessible(true); 
      setEdgeEffectColor((EdgeEffect) fEdgeEffect.get(edge), 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) { 
    } 
}