设为首页 加入收藏

TOP

Android自定义侧滑菜单slidmenu(一)
2015-02-25 16:14:22 来源: 作者: 【 】 浏览:93
Tags:Android 定义 菜单 slidmenu

在制做一个软件的时候要用到侧滑菜单(SlidMenu),而且,现在这个应用在软件开发中应用很多!虽然网上有好多说是实现了这个功能,csdn上资源下载那里也有好多提供下载,但当我一个一个的测试了之后,只能感叹一句“坑爹啊!”都是由bug的,想想还是自己来实现吧!


实现上主要就是一个自定义的MySlidView,在这个MySlidView里边去加载两个你要显示的View(mMenuView, mSlidView),即一个是滑动之后,左侧的mSlidView,另一个就是关闭mMenuView之后的mSlidView!


而菜单的打开与关闭,实际上就是操作上层的mSlidView的滑动,当需要打开菜单时,让mSlidView向右边滑动,如果要关闭menu,就再让它滑回来,


slidmenu


slidmenu


主要代码就是自定义的类:


/**
?* @author Administrator
?*
?*/
public class MySlidView extends RelativeLayout {


?private View mMenuView;
?private View mSlidView;


?private RelativeLayout bgShade;


?private Context mContext;


?private float mTouchSlop;


?private Scroller mScroller; // 滑动控制
?private VelocityTracker mVelocityTracker; // 用于判断甩动手势
?private static final int SNAP_VELOCITY = 100; // 滑动速度阀值


?private float mLastMotionX;
?private float mLastMotionY;
?private float mFirstMotionX;
?private int menuWidth; ? //侧边菜单slidmenu的宽度


?public int menuState;? //菜单状态
?private boolean mIsBeingDragged = true; // 是否在滑动


?public MySlidView(Context context) {
? super(context);
? init(context);
?}


?public MySlidView(Context context, AttributeSet attrs) {
? super(context, attrs);
? init(context);
?}


?public MySlidView(Context context, AttributeSet attrs, int defStyle) {
? super(context, attrs, defStyle);
? init(context);
?}


?/**
? * @param context
? * 初始化
? */
?private void init(Context context) {
? mContext = context;
? mScroller = new Scroller(context);


? menuState = ConstantQuantity.MENU_STATE_CLOSE;


? mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();


? bgShade = new RelativeLayout(context);
?}


?/**
? * @param menu
? * @param slid
? */
?public void addViews(View menu, View slid) {
? setMenuView(menu);
? setSlidView(slid);
?}


?@Override
?public void scrollTo(int x, int y) {
? super.scrollTo(x, y);
? postInvalidate();
?}


?/**
? * @see android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
? * 拦截手势,在处理触屏操作之前先拦截下触屏事件进行判断之后的操作!
? */
?@Override
?public boolean onInterceptTouchEvent(MotionEvent event) {
? menuWidth = getMenuViewWidth();
? int action = event.getAction();


? float x = event.getX();
? float y = event.getY();


? switch (action) {
? case MotionEvent.ACTION_DOWN:
? ?mFirstMotionX = x;
? ?mLastMotionX = x;
? ?mLastMotionY = y;
? ?mIsBeingDragged = false;
? ?
? ?break;
? case MotionEvent.ACTION_MOVE:
? ?float deltaX = mLastMotionX - x;
? ?float deltaY = mLastMotionY - y;
? ?if (Math.abs(deltaX) > mTouchSlop
? ? ?&& Math.abs(deltaX) > Math.abs(deltaY)) {
? ? float oldScrollX = mSlidView.getScrollX();
? ? if (oldScrollX <= 0) {
? ? ?mIsBeingDragged = true;
? ? ?mLastMotionX = x;
? ? } else {
? ? ?if (deltaX < 0) {
? ? ? mIsBeingDragged = true;
? ? ? mLastMotionX = x;
? ? ?}
? ? }
? ?}
? ?if (menuState == ConstantQuantity.MENU_STATE_OPEN) {
? ? System.out.println(mFirstMotionX + " ; "
? ? ? + mSlidView.getScrollX());
? ? if (mFirstMotionX >= 0
? ? ? && mFirstMotionX < Math.abs(mSlidView.getScrollX())) {
? ? ?mIsBeingDragged = false;
? ? }
? ?}
? ?break;
? case MotionEvent.ACTION_UP:
? case MotionEvent.ACTION_CANCEL:
? ?if (menuState == ConstantQuantity.MENU_STATE_OPEN) {
? ? if(mFirstMotionX >= menuWidth && mLastMotionX >= menuWidth){
? ? ?openMenuView();
? ? }
? ?}
? ?break;
? }?
? return mIsBeingDragged;
?}


?/**
? * @see android.view.View#onTouchEvent(android.view.MotionEvent)
? * 手势处理
? * 这里去处理触屏操作
? */
?@Override
?public boolean onTouchEvent(MotionEvent event) {
? int action = event.getAction();
? float x = event.getX();
? float y = event.getY();
? if (mVelocityTracker == null) {
? ?mVelocityTracker =

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android判断设备网络连接状态,并.. 下一篇Android 自定义控件打造史上最简..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: