package net.simonvt.menudrawer; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.widget.FrameLayout; /** * FrameLayout which caches the hardware layer if available. * <p/> * If it's not posted twice the layer either wont be built on start, or it'll be built twice. */ public class BuildLayerFrameLayout extends FrameLayout { private boolean mChanged; private boolean mHardwareLayersEnabled = true; private boolean mAttached; private boolean mFirst = true; public BuildLayerFrameLayout(Context context) { super(context); if (MenuDrawer.USE_TRANSLATIONS) { setLayerType(LAYER_TYPE_HARDWARE, null); } } public BuildLayerFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); if (MenuDrawer.USE_TRANSLATIONS) { setLayerType(LAYER_TYPE_HARDWARE, null); } } public BuildLayerFrameLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); if (MenuDrawer.USE_TRANSLATIONS) { setLayerType(LAYER_TYPE_HARDWARE, null); } } void setHardwareLayersEnabled(boolean enabled) { mHardwareLayersEnabled = enabled; } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mAttached = true; } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mAttached = false; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (MenuDrawer.USE_TRANSLATIONS && mHardwareLayersEnabled) { post(new Runnable() { @Override public void run() { mChanged = true; invalidate(); } }); } } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (mChanged && MenuDrawer.USE_TRANSLATIONS) { post(new Runnable() { @Override public void run() { if (mAttached) { final int layerType = getLayerType(); // If it's already a hardware layer, it'll be built anyway. if (layerType != LAYER_TYPE_HARDWARE || mFirst) { mFirst = false; setLayerType(LAYER_TYPE_HARDWARE, null); buildLayer(); setLayerType(LAYER_TYPE_NONE, null); } } } }); mChanged = false; } } }