安卓幻灯片菜单右侧

时间:2015-11-25 14:44:45

标签: android android-linearlayout android-scrollview android-sliding

我尝试创建幻灯片菜单从右到左幻灯片menu.i搜索自定义幻灯片菜单,我找到了源,但此源是从左到右的幻灯片菜单 这是一个来源

public class MainLayout extends LinearLayout {

    private static final int SLIDING_DURATION = 500;
    private static final int QUERY_INTERVAL = 16;
    int mainLayoutWidth;
    private View menu;
    private View content;
    private static int menuRightMargin = 5;

    private enum MenuState {
        HIDING, HIDDEN, SHOWING, SHOWN,
    };

    private int contentXOffset;
    private MenuState currentMenuState = MenuState.HIDDEN;
    private Scroller menuScroller = new Scroller(this.getContext(),
            new EaseInInterpolator());
    private Runnable menuRunnable = new MenuRunnable();
    private Handler menuHandler = new Handler();
    int prevX = 0;
    boolean isDragging = false;
    int lastDiffX = 0;

    public MainLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MainLayout(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        mainLayoutWidth = MeasureSpec.getSize(widthMeasureSpec);
        menuRightMargin = mainLayoutWidth * 60 / 100;
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        menu = this.getChildAt(0);
        content = this.getChildAt(1);
        content.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return MainLayout.this.onContentTouch(v, event);
            }
        });
        menu.setVisibility(View.GONE);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        if (changed) {
            LayoutParams contentLayoutParams = (LayoutParams) content
                    .getLayoutParams();
            contentLayoutParams.height = this.getHeight();
            contentLayoutParams.width = this.getWidth();
            LayoutParams menuLayoutParams = (LayoutParams) menu
                    .getLayoutParams();
            menuLayoutParams.height = this.getHeight();
            menuLayoutParams.width = this.getWidth() - menuRightMargin;
        }
        menu.layout(left, top, right - menuRightMargin, bottom);
        content.layout(left + contentXOffset, top, right + contentXOffset,
                bottom);

    }

    public void toggleMenu() {

        if (currentMenuState == MenuState.HIDING
                || currentMenuState == MenuState.SHOWING)
            return;

        switch (currentMenuState) {
        case HIDDEN:
            currentMenuState = MenuState.SHOWING;
            menu.setVisibility(View.VISIBLE);
            menuScroller.startScroll(0, 0, menu.getLayoutParams().width, 0,
                    SLIDING_DURATION);
            break;
        case SHOWN:
            currentMenuState = MenuState.HIDING;
            menuScroller.startScroll(contentXOffset, 0, -contentXOffset, 0,
                    SLIDING_DURATION);
            break;
        default:
            break;
        }
        menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL);
        this.invalidate();
    }

    protected class MenuRunnable implements Runnable {
        @Override
        public void run() {
            boolean isScrolling = menuScroller.computeScrollOffset();
            adjustContentPosition(isScrolling);
        }
    }

    private void adjustContentPosition(boolean isScrolling) {
        int scrollerXOffset = menuScroller.getCurrX();

        content.offsetLeftAndRight(scrollerXOffset - contentXOffset);

        contentXOffset = scrollerXOffset;
        this.invalidate();
        if (isScrolling)
            menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL);
        else
            this.onMenuSlidingComplete();
    }

    private void onMenuSlidingComplete() {
        switch (currentMenuState) {
        case SHOWING:
            currentMenuState = MenuState.SHOWN;
            break;
        case HIDING:
            currentMenuState = MenuState.HIDDEN;
            menu.setVisibility(View.GONE);
            break;
        default:
            return;
        }
    }

    protected class EaseInInterpolator implements Interpolator {
        @Override
        public float getInterpolation(float t) {
            return (float) Math.pow(t - 1, 5) + 1;
        }

    }

    public boolean isMenuShown() {
        return currentMenuState == MenuState.SHOWN;
    }

    public boolean onContentTouch(View v, MotionEvent event) {
        if (currentMenuState == MenuState.HIDING
                || currentMenuState == MenuState.SHOWING)
            return false;
        int curX = (int) event.getRawX();
        int diffX = 0;

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:

            prevX = curX;
            return true;

        case MotionEvent.ACTION_MOVE:
            if (!isDragging) {
                isDragging = true;
                menu.setVisibility(View.VISIBLE);
            }
            diffX = curX - prevX;
            if (contentXOffset + diffX <= 0) {
                diffX = -contentXOffset;
            } else if (contentXOffset + diffX > mainLayoutWidth
                    - menuRightMargin) {
                diffX = mainLayoutWidth + menuRightMargin + contentXOffset;
            }
            content.offsetLeftAndRight(diffX);
            contentXOffset += diffX;
            this.invalidate();

            prevX = curX;
            lastDiffX = diffX;
            return true;

        case MotionEvent.ACTION_UP:
            Log.d("MainLayout.java onContentTouch()", "Up lastDiffX "
                    + lastDiffX);

            if (lastDiffX > 0) {
                currentMenuState = MenuState.SHOWING;
                menuScroller.startScroll(contentXOffset, 0,
                        menu.getLayoutParams().width - contentXOffset, 0,
                        SLIDING_DURATION);
            } else if (lastDiffX < 0) {
                currentMenuState = MenuState.HIDING;
                menuScroller.startScroll(contentXOffset, 0, -contentXOffset, 0,
                        SLIDING_DURATION);
            }
            menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL);
            this.invalidate();
            isDragging = false;
            prevX = 0;
            lastDiffX = 0;
            return true;

        default:
            break;
        }

        return false;
    }
}

这个代码工作perfec.i可以创建幻灯片菜单,但现在我想重写这个代码。我想从右到左接收幻灯片菜单。我想交换这个例子。 p.s我知道关于幻灯片菜单的相同好例子,但我想重写这个来源。 我怎么能解决我的问题?如果有人知道解决方案,请帮助我。谢谢大家

1 个答案:

答案 0 :(得分:0)

要让您的主要内容展开,请在下方显示一个菜单,这里有一个很好的示例:https://stackoverflow.com/questions/33587371/android-move-main-content-to-reveal‌​-drawer

由于您希望在右侧显示菜单,因此您只需从父视图的宽度中减去X计算,在示例中为DrawerLayout,称为drawerLayout。因此,您将对这些行进行以下调整:

这是设置抽屉和内容的X位置的原始代码:

drawerContent.setX(drawerView.getWidth() * (1 - slideOffset));
mainContent.setX(drawerView.getWidth() * slideOffset);

这些计算在位置0处开始滑动,并将内容滑动到抽屉的宽度。相反,我们想要一个父布局宽度的起始位置(我们的drawerLayout视图),并向后滑回零(直到抽屉的宽度)。所以我们会改变这些:

drawerContent.setX(drawerLayout.getWidth() - (drawerView.getWidth() * (1 - slideOffset)));
mainContent.setX(drawerLayout.getWidth() - (drawerView.getWidth() * slideOffset));