为什么我的菜单不向左滑动?

时间:2014-12-09 19:08:12

标签: android animation menu

我按照滑动菜单的教程:

https://www.youtube.com/watch?v=UYPmRhiUMOI

问题是,他从左到右滑动菜单,同时从左到右滑动内容。我需要的是从右到左滑动菜单,所以我自定义了他的代码:

public class FlyOutMenu extends LinearLayout {


public FlyOutMenu(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    // TODO Auto-generated constructor stub
}

public FlyOutMenu(Context context, AttributeSet attrs) {
    // TODO Auto-generated constructor stub
    super(context, attrs);
}

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

private View menu, content;

public static int menuMargin = 700;
private static final int menuAnimationDuration = 700;
private static final int menuAnimationPollingIntervall = 16;


public static enum MenuState {
    CLOSED, OPEN, CLOSING, OPENING;
}

protected int currentContentOffset = 0;
public static MenuState menuCurrentState = MenuState.CLOSED;

protected Scroller newAnimationScroller = new Scroller(this.getContext(), new SmoothInterpolator());

protected Runnable animationRunnable = new AnimationRunnable();
protected Handler animationHandler = new Handler();

protected class SmoothInterpolator implements Interpolator {

    @Override
    public float getInterpolation(float input) {
        // TODO Auto-generated method stub
        return (float) (Math.pow(input -1 , 5) + 1);
    }



}


@Override
protected void onAttachedToWindow() {
    // TODO Auto-generated method stub
    super.onAttachedToWindow();
    this.menu = this.getChildAt(0);
    this.content = this.getChildAt(1);

    this.menu.setVisibility(View.GONE);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    // TODO Auto-generated method stub
    super.onLayout(changed, left, top, right, bottom);
    if(changed)
        this.calculateChildDimensions();

    this.menu.layout(left + DialogBox.screenWidth/2, top, right, bottom);
    this.content.layout(left - this.currentContentOffset, top, right - this.currentContentOffset, bottom);
}

private void calculateChildDimensions() {
    this.content.getLayoutParams().width = this.getWidth();
    this.content.getLayoutParams().height = this.getHeight();

    this.menu.getLayoutParams().width = DialogBox.screenWidth/2;
    this.menu.getLayoutParams().height = this.getHeight();
}

public void toggleMenu() {
    switch (menuCurrentState) {
    case CLOSED:
        menuCurrentState = MenuState.OPENING;
        this.menu.setVisibility(View.VISIBLE);
        newAnimationScroller.startScroll(0, 0, -this.menu.getWidth(), 0, menuAnimationDuration);
        break;

    case OPEN:
        menuCurrentState = MenuState.CLOSING;
        newAnimationScroller.startScroll(this.currentContentOffset, 0, -this.currentContentOffset, 0, menuAnimationDuration);

        break;
    default:
        break;
    }

    this.animationHandler.postDelayed(animationRunnable, menuAnimationPollingIntervall);
}

private void adjustContentPosition(boolean isAnimationActive) {
    int scrollerOffset = this.newAnimationScroller.getCurrX();
    this.content.offsetLeftAndRight(scrollerOffset - this.currentContentOffset);

    this.currentContentOffset = +scrollerOffset;

    this.invalidate();

    if(isAnimationActive)
        this.animationHandler.postDelayed(this.animationRunnable, menuAnimationPollingIntervall);
    else
        this.onMenuTransitionComplete();
}

private void onMenuTransitionComplete() {
    switch(menuCurrentState){
        case OPENING:
            menuCurrentState = MenuState.OPEN;
            break;

        case CLOSING:
            menuCurrentState = MenuState.CLOSED;
            this.menu.setVisibility(View.GONE);
        default:
            break;
    }

}

protected class AnimationRunnable implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        boolean isAnimationActive = FlyOutMenu.this.newAnimationScroller
                .computeScrollOffset();
        FlyOutMenu.this.adjustContentPosition(isAnimationActive);
    }
}

}

有两个views。一个是Content,一个是menu。两者都应该从右向左滑动。没有动画一切正常。 但是通过动画我的content-view从右到左完美地滑动,我的menu-view立即出现。我想两个都滑!

我创建了一个包含四种状态的枚举:

OPEN菜单已打开。 CLOSE菜单已关闭。 OPENING菜单目前正在打开。 CLOSING菜单目前正在关闭。

用于滑动创建的名为newAnimationScroller的滚动条。为了在特定时间更新UI,我创建了一个名为animationHandler的处理程序,它使用名为animationRunnable的Runnable。

currentContentOffset是相对于其父级的内容的偏移量。

如果我点击特定按钮,我会从活动中设置toggleMenu()。然后newAnimationScroller.startScroll(..);启动动画。

我尝试解释所有内容,以便您快速轻松地理解代码并能够支持我。

如果有任何问题可以随时提出。

我的问题

在某个地方,我错过了一个细节,看起来他只是动画内容而不是菜单。 内容再次滑动,菜单立即出现。 我想要的是什么:内容和菜单从右向左滑动。

感谢任何帮助。

谢谢你。

1 个答案:

答案 0 :(得分:0)

我认为您想要使用的是导航抽屉

请参阅官方Android Dev页面中的here,了解如何创建导航抽屉。它还有一个很棒的示例可供下载。

使用它,你不会后悔。对我来说它完美无缺! 你可以把任何东西都放在那里 - 不只是浏览项目,而是onClick,你可以随心所欲。如果你想要Options。在导航抽屉中创建一个项Options,然后点击它打开一个Options Fragment(例如)并在那里做任何你想做的事。