我按照滑动菜单的教程:
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(..);
启动动画。
我尝试解释所有内容,以便您快速轻松地理解代码并能够支持我。
如果有任何问题可以随时提出。
我的问题:
在某个地方,我错过了一个细节,看起来他只是动画内容而不是菜单。 内容再次滑动,菜单立即出现。 我想要的是什么:内容和菜单从右向左滑动。
感谢任何帮助。
谢谢你。
答案 0 :(得分:0)
我认为您想要使用的是导航抽屉。
请参阅官方Android Dev页面中的here,了解如何创建导航抽屉。它还有一个很棒的示例可供下载。
使用它,你不会后悔。对我来说它完美无缺!
你可以把任何东西都放在那里 - 不只是浏览项目,而是onClick
,你可以随心所欲。如果你想要Options
。在导航抽屉中创建一个项Options
,然后点击它打开一个Options Fragment
(例如)并在那里做任何你想做的事。