czxzx2014 2016-05-10 15:54 采纳率: 15.4%
浏览 1212

关于Android Slidemenu的问题

public class SlideMenu extends HorizontalScrollView{

private LinearLayout mWapper;
private ViewGroup mMenu;
private ViewGroup mContent;
private int mScreenWidth;
private int mMenuRightPadding;
private int mMenuWidth = 0;

private boolean once = false;
//Menu是否处于显示状态
private boolean isSlideOut;

public static final int RIGHT_PADDING = 100;

public SlideMenu(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(metrics);
    mScreenWidth = metrics.widthPixels;
    //将dp转化为px
    mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, SlideMenu.RIGHT_PADDING, context.getResources().getDisplayMetrics());
}

/**
 * 设置子View的宽和高
 * 设置自己的宽和高
 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // TODO Auto-generated method stub
    if(!once){
        mWapper = (LinearLayout) getChildAt(0);
        mMenu = (ViewGroup) mWapper.getChildAt(0);
        mContent = (ViewGroup) mWapper.getChildAt(1);

        mMenuWidth  = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding;
        mContent.getLayoutParams().width = mScreenWidth;
        once = true;
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
 * 通过设置偏移量将Menu隐藏
 */
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // TODO Auto-generated method stub
    super.onLayout(changed, l, t, r, b);
    if(changed){
        this.scrollTo(mMenuWidth, 0);
    }
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    int action = ev.getAction();
    switch (action) {
        case MotionEvent.ACTION_UP:
            //隐藏在左边宽度
            int scrollX = getScrollX();
            if(scrollX >= mMenuWidth /2){
                //Menu 左滑隐藏起来
                this.smoothScrollTo(mMenuWidth, 0);
                isSlideOut = false;
            }else{
                //Menu 右滑 显示出来
                this.smoothScrollTo(0, 0);
                isSlideOut = true;
            }
            return true;
    }
    return super.onTouchEvent(ev);
}
/**
 * 向右滑出菜单显示出来
 */
public void slideOutMenu(){
    if(!isSlideOut){
        this.smoothScrollTo(0, 0);
        isSlideOut = true;
    }else{
        return;
    }
 }  
/**
 * 向左滑出菜单隐藏起来 
 */
public void slideInMenu(){
    if(isSlideOut){
        this.smoothScrollTo(mMenuWidth, 0);
        isSlideOut = false;
    }else{
        return;
    }
}
/**
 * 切换菜单向右滑出显示或向左滑出隐藏的状态
 */
public void switchMenu(){
    if(isSlideOut){
        slideInMenu();
    }else{
        slideOutMenu();
    }
}
 public class MainActivity extends Activity {
    //这个是声明一个自定义的那个控件
    private SlideMenu xcSlideMenu;
    //这个是声明页面上的头像的那个image控件的ID
    private TextView btnSwitch;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);
        xcSlideMenu = (SlideMenu) findViewById(R.id.slideMenu);
        btnSwitch = (TextView)findViewById(R.id.btnSwitch);
        //给声明的image控件添加点击监听事件
        btnSwitch.setClickable(true);
        btnSwitch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 表示点击触发控件内部的右划和左划的事件
                xcSlideMenu.switchMenu();
                //btnSwitch.setVisibility(View.INVISIBLE);
            }
        });

    }

上面是相关的类
在主活动的界面中可以滑动,也可以按动btnSwitch来实现侧滑,想请教各位大神如何关闭手势滑动,而仅用按钮来实现滑动
图片说明

  • 写回答

2条回答

  • czxzx2014 2016-05-10 15:55
    关注

    谢谢各位大神指教

    评论

报告相同问题?

悬赏问题

  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架