Last active
November 10, 2017 10:49
-
-
Save alexfu/7921852 to your computer and use it in GitHub Desktop.
A ContextWrapper that provides a custom Drawable for overscroll egde and glow. http://alexfu.github.io/blog/2013/12/11/customizing-edgeeffect/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.content.Context; | |
import android.content.ContextWrapper; | |
import android.content.res.AssetManager; | |
import android.content.res.Configuration; | |
import android.content.res.Resources; | |
import android.graphics.drawable.Drawable; | |
import android.util.DisplayMetrics; | |
import android.util.Log; | |
/** | |
* Custom ContextWrapper to modify certain Context related | |
* actions/behaviors. | |
*/ | |
public class MyContextWrapper extends ContextWrapper { | |
private MyContextWrapper mResources; | |
public MyContextWrapper(Context baseContext) { | |
super(baseContext); | |
Resources baseRes = baseContext.getResources(); | |
mResources = new MyContextWrapper(baseRes.getAssets(), baseRes.getDisplayMetrics(), baseRes.getConfiguration()); | |
} | |
@Override | |
public Resources getResources() { | |
return mResources; | |
} | |
private class MyContextWrapper extends Resources { | |
private int overscrollEdge, overscrollGlow; | |
public MyContextWrapper(AssetManager assets, DisplayMetrics metrics, Configuration config) { | |
super(assets, metrics, config); | |
overscrollEdge = getPlatformDrawableId("overscroll_edge"); | |
overscrollGlow = getPlatformDrawableId("overscroll_glow"); | |
} | |
@Override | |
public Drawable getDrawable(int id) throws NotFoundException { | |
// If the incoming id is equal to the com.android.internal.R.drawable.overscroll_edge | |
// or com.android.internal.R.drawable.overscroll_glow ID, we'll provide our own Drawable. | |
if(id == overscrollEdge) { | |
return getBaseContext().getResources().getDrawable(R.drawable.overscroll_edge); | |
} else if(id == overscrollGlow) { | |
return getBaseContext().getResources().getDrawable(R.drawable.overscroll_glow); | |
} else { | |
return super.getDrawable(id); | |
} | |
} | |
/** | |
* Get the Android Drawable id that matches the given | |
* drawable name. | |
*/ | |
private int getPlatformDrawableId(String name) { | |
try { | |
return ((Integer) Class.forName("com.android.internal.R$drawable").getField(name).get(null)).intValue(); | |
} catch (IllegalAccessException e) { | |
Log.e("MyContextWrapper", e.getMessage()); | |
return 0; | |
} catch (NoSuchFieldException e) { | |
Log.e("MyContextWrapper", e.getMessage()); | |
return 0; | |
} catch (ClassNotFoundException e) { | |
Log.e("MyContextWrapper", e.getMessage()); | |
return 0; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment