package net.simonvt.menudrawer; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; public abstract class StaticDrawer extends MenuDrawer { protected Position mPosition; StaticDrawer(Activity activity, int dragMode) { super(activity, dragMode); } public StaticDrawer(Context context) { super(context); } public StaticDrawer(Context context, AttributeSet attrs) { super(context, attrs); } public StaticDrawer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (mDropShadowEnabled) drawDropShadow(canvas); if (mActiveIndicator != null) drawIndicator(canvas); } private void drawDropShadow(Canvas canvas) { final int width = getWidth(); final int height = getHeight(); final int menuSize = mMenuSize; final int dropShadowSize = mDropShadowSize; switch (mPosition) { case LEFT: mDropShadowDrawable.setBounds(menuSize - dropShadowSize, 0, menuSize, height); break; case TOP: mDropShadowDrawable.setBounds(0, menuSize - dropShadowSize, width, menuSize); break; case RIGHT: mDropShadowDrawable.setBounds(width - menuSize, 0, width - menuSize + dropShadowSize, height); break; case BOTTOM: mDropShadowDrawable.setBounds(0, height - menuSize, width, height - menuSize + dropShadowSize); break; } mDropShadowDrawable.draw(canvas); } protected abstract void drawIndicator(Canvas canvas); @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { final int width = r - l; final int height = b - t; switch (mPosition) { case LEFT: mMenuContainer.layout(0, 0, mMenuSize, height); mContentContainer.layout(mMenuSize, 0, width, height); break; case RIGHT: mMenuContainer.layout(width - mMenuSize, 0, width, height); mContentContainer.layout(0, 0, width - mMenuSize, height); break; case TOP: mMenuContainer.layout(0, 0, width, mMenuSize); mContentContainer.layout(0, mMenuSize, width, height); break; case BOTTOM: mMenuContainer.layout(0, height - mMenuSize, width, height); mContentContainer.layout(0, 0, width, height - mMenuSize); break; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("Must measure with an exact size"); } final int width = MeasureSpec.getSize(widthMeasureSpec); final int height = MeasureSpec.getSize(heightMeasureSpec); if (!mMenuSizeSet) mMenuSize = (int) (height * 0.25f); switch (mPosition) { case LEFT: case RIGHT: { final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); final int menuWidth = mMenuSize; final int menuWidthMeasureSpec = MeasureSpec.makeMeasureSpec(menuWidth, MeasureSpec.EXACTLY); final int contentWidth = width - menuWidth; final int contentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(contentWidth, MeasureSpec.EXACTLY); mContentContainer.measure(contentWidthMeasureSpec, childHeightMeasureSpec); mMenuContainer.measure(menuWidthMeasureSpec, childHeightMeasureSpec); break; } case TOP: case BOTTOM: { final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); final int menuHeight = mMenuSize; final int menuHeightMeasureSpec = MeasureSpec.makeMeasureSpec(menuHeight, MeasureSpec.EXACTLY); final int contentHeight = height - menuHeight; final int contentHeightMeasureSpec = MeasureSpec.makeMeasureSpec(contentHeight, MeasureSpec.EXACTLY); mContentContainer.measure(childWidthMeasureSpec, contentHeightMeasureSpec); mMenuContainer.measure(childWidthMeasureSpec, menuHeightMeasureSpec); break; } } setMeasuredDimension(width, height); } @Override public void toggleMenu(boolean animate) { } @Override public void openMenu(boolean animate) { } @Override public void closeMenu(boolean animate) { } @Override public boolean isMenuVisible() { return true; } @Override public void setMenuSize(int size) { mMenuSize = size; mMenuSizeSet = true; requestLayout(); invalidate(); } @Override public void setOffsetMenuEnabled(boolean offsetMenu) { } @Override public boolean getOffsetMenuEnabled() { return false; } @Override public void peekDrawer() { } @Override public void peekDrawer(long delay) { } @Override public void peekDrawer(long startDelay, long delay) { } @Override public void setHardwareLayerEnabled(boolean enabled) { } @Override public int getTouchMode() { return TOUCH_MODE_NONE; } @Override public void setTouchMode(int mode) { } @Override public void setTouchBezelSize(int size) { } @Override public int getTouchBezelSize() { return 0; } }