半屏滑动导航

时间:2013-12-04 07:19:06

标签: android android-layout navigation android-animation

我想在这个应用程序中为我的Android应用程序创建一个屏幕我想创建滑动导航功能,在滑动(从左到右)完全可见,当用户再次滑动(从左到右)时再次滑动并关闭导航窗口一半和显示半屏,我已经使用了导航抽屉,但我不知道这个所以请一些帮助我,如果你有任何代码所以请发给我它将是我的荣幸。 我发送一张图片供参考。 required screen closed in red rectangle

2 个答案:

答案 0 :(得分:1)

查找下面的代码创建一个类AnimationLayout

import usb.terminal.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;

public class AnimationLayout extends ViewGroup {

public final static int DURATION = 1000;

protected boolean mPlaceLeft = true;
public boolean mOpened;
protected View mSidebar;
protected View mContent;
protected int mSidebarWidth = 100; /*
                                     * assign default value. It will be
                                     * overwrite in onMeasure by Layout xml
                                     * resource.
                                     */
protected Animation mAnimation;
protected OpenListener mOpenListener;
protected CloseListener mCloseListener;
protected Listener mListener;

protected boolean mPressed = false;

public AnimationLayout(Context context) {
    this(context, null);
}

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

@Override
public void onFinishInflate() {
    super.onFinishInflate();
    mSidebar = findViewById(R.id.animation_layout_sidebar);
    mContent = findViewById(R.id.animation_layout_content);

    if (mSidebar == null) {
        throw new NullPointerException("no view id = animation_sidebar");
    }

    if (mContent == null) {
        throw new NullPointerException("no view id = animation_content");
    }

    mOpenListener = new OpenListener(mSidebar, mContent);
    mCloseListener = new CloseListener(mSidebar, mContent);
}

@Override
public void onLayout(boolean changed, int l, int t, int r, int b) {
    /* the title bar assign top padding, drop it */
    int sidebarLeft = l;
    if (!mPlaceLeft) {
        sidebarLeft = r - mSidebarWidth;
    }
    mSidebar.layout(sidebarLeft, 0, sidebarLeft + mSidebarWidth,
            0 + mSidebar.getMeasuredHeight());

    if (mOpened) {
        if (mPlaceLeft) {
            mContent.layout(l + mSidebarWidth, 0, r + mSidebarWidth, b);
        } else {
            mContent.layout(l - mSidebarWidth, 0, r - mSidebarWidth, b);
        }
    } else {
        mContent.layout(l, 0, r, b);
    }
}

@Override
public void onMeasure(int w, int h) {
    super.onMeasure(w, h);
    super.measureChildren(w, h);
    mSidebarWidth = mSidebar.getMeasuredWidth();
}

@Override
protected void measureChild(View child, int parentWSpec, int parentHSpec) {
    /* the max width of Sidebar is 90% of Parent */
    if (child == mSidebar) {
        int mode = MeasureSpec.getMode(parentWSpec);
        int width = (int) (getMeasuredWidth() * 0.9);
        super.measureChild(child, MeasureSpec.makeMeasureSpec(width, mode),
                parentHSpec);
    } else {
        super.measureChild(child, parentWSpec, parentHSpec);
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (!isOpening()) {
        return false;
    }

    int action = ev.getAction();

    if (action != MotionEvent.ACTION_UP
            && action != MotionEvent.ACTION_DOWN) {
        return false;
    }

    /*
     * if user press and release both on Content while sidebar is opening,
     * call listener. otherwise, pass the event to child.
     */
    int x = (int) ev.getX();
    int y = (int) ev.getY();
    if (mContent.getLeft() < x && mContent.getRight() > x
            && mContent.getTop() < y && mContent.getBottom() > y) {
        if (action == MotionEvent.ACTION_DOWN) {
            mPressed = true;
        }

        if (mPressed && action == MotionEvent.ACTION_UP
                && mListener != null) {
            mPressed = false;
            return mListener.onContentTouchedWhenOpening();
        }
    } else {
        mPressed = false;
    }

    return false;
}

public void setListener(Listener l) {
    mListener = l;
}

/* to see if the Sidebar is visible */
public boolean isOpening() {
    return mOpened;
}

public void toggleSidebar() {
    if (mContent.getAnimation() != null) {
        return;
    }

    if (mOpened) {
        /* opened, make close animation */
        if (mPlaceLeft) {
            mAnimation = new TranslateAnimation(0, -mSidebarWidth, 0, 0);
        } else {
            mAnimation = new TranslateAnimation(0, mSidebarWidth, 0, 0);
        }
        mAnimation.setAnimationListener(mCloseListener);
    } else {
        /* not opened, make open animation */
        if (mPlaceLeft) {
            mAnimation = new TranslateAnimation(0, mSidebarWidth, 0, 0);
        } else {
            mAnimation = new TranslateAnimation(0, -mSidebarWidth, 0, 0);
        }
        mAnimation.setAnimationListener(mOpenListener);
    }
    mAnimation.setDuration(DURATION);
    mAnimation.setFillAfter(true);
    mAnimation.setFillEnabled(true);
    mContent.startAnimation(mAnimation);
}

public void openSidebar() {
    if (!mOpened) {
        toggleSidebar();
    }
}

public void closeSidebar() {
    if (mOpened) {
        toggleSidebar();
    }
}

class OpenListener implements Animation.AnimationListener {
    View iSidebar;
    View iContent;

    OpenListener(View sidebar, View content) {
        iSidebar = sidebar;
        iContent = content;
    }

    public void onAnimationRepeat(Animation animation) {
    }

    public void onAnimationStart(Animation animation) {
        iSidebar.setVisibility(View.VISIBLE);
    }

    public void onAnimationEnd(Animation animation) {
        iContent.clearAnimation();
        mOpened = !mOpened;
        requestLayout();
        if (mListener != null) {
            mListener.onSidebarOpened();
        }
    }
}

class CloseListener implements Animation.AnimationListener {
    View iSidebar;
    View iContent;

    CloseListener(View sidebar, View content) {
        iSidebar = sidebar;
        iContent = content;
    }

    public void onAnimationRepeat(Animation animation) {
    }

    public void onAnimationStart(Animation animation) {
    }

    public void onAnimationEnd(Animation animation) {
        iContent.clearAnimation();
        iSidebar.setVisibility(View.INVISIBLE);
        mOpened = !mOpened;
        requestLayout();
        if (mListener != null) {
            mListener.onSidebarClosed();
        }
    }
}

public interface Listener {
    public void onSidebarOpened();

    public void onSidebarClosed();

    public boolean onContentTouchedWhenOpening();
}

}

创建一个mainlayout.xml

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  >

    <yourpackage..AnimationLayout
        android:id="@+id/animation_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
  <!--Create you Layout which you want and just call in this include-->
        <include
            android:id="@id/animation_layout_sidebar"
            android:layout_width="470dp"
            android:layout_height="match_parent"
            layout="@layout/my_cook_menu"
            android:orientation="vertical" >
        </include>
  <!--Create you Layout which you want and just call in this include-->
        <include
            android:id="@id/animation_layout_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            layout="@layout/sound_my_cook"
            android:clickable="true"
            android:focusable="true"
            android:orientation="vertical" >
        </include>
    </yourpackage.AnimationLayout>
</RelativeLayout>

在values文件夹中创建id.xml

 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 <item type="id" name="animation_layout_sidebar" />
 <item type="id" name="animation_layout_content" />
 </resources>

在您正在调用的活动中编写此代码

public class MainActivity extends Activity implements
     AnimationLayout.Listener, OnClickListener{
AnimationDrawable frameAnimation;
AnimationLayout animationLayout;


protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.mainlayout);


}

public void onClick(View v) {
      try {
                animationLayout = (AnimationLayout) findViewById(R.id.animation_layout);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            animationLayout.toggleSidebar();
  }

   @Override
   public void onSidebarOpened() {
    // TODO Auto-generated method stub

   }

  @Override
  public void onSidebarClosed() {
    // TODO Auto-generated method stub

  }

  @Override
  public boolean onContentTouchedWhenOpening() {
    // TODO Auto-generated method stub
    return false;
    }
 }

答案 1 :(得分:0)

我还没有尝试过,但我认为最近添加到支持库的 DrawerLayout 可以满足您的需求。 Here is the link for documentation.这是Facebook应用程序用于从左到右滑动面板的东西。 Here is the tutorial.