###侧滑菜单侧滑操作
cn.itcast.slidingmenu.ui.MySlidingMenu.java
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getX();
//1.获取移动的距离
distance =currentStart+moveX - downX;
//2.移动操作
//移动控件的操作,参数1:x轴的移动距离;参数2:y轴的移动距离
/*scrollTo(0, 0)
scrollBy(0, 0)*/
//3.控制滑动的范围
if (distance < 0) {
distance = 0;
}else if(distance > menuWidth){
distance = menuWidth;
}
myScrollTo(distance);
break;
case MotionEvent.ACTION_UP:
//4.当松开鼠标的时候,记住当前滑动位置,方便下一次滑动的时候,从记住的滑动位置开始滑动
currentStart = distance;
break;
}
return true;
}
###自动滑动的操作
cn.itcast.slidingmenu.ui.MySlidingMenu.java
case MotionEvent.ACTION_UP:
//4.当松开鼠标的时候,记住当前滑动位置,方便下一次滑动的时候,从记住的滑动位置开始滑动
//currentStart = distance;
//5.自动滑动的操作
if (distance < menuWidth/2) {
//移动到0的位置
myScrollTo(0);
//保存下一次移动的时候,从0开始移动
currentStart = 0;
}else{
//移动到整个菜单页的宽度
myScrollTo(menuWidth);
currentStart=menuWidth;
}
break;
###缓慢移动的效果
cn.itcast.slidingmenu.ui.MySlidingMenu.java
/**
*
* @Description:缓慢滑动操作
* @param
*
startX : 开始的位置
*
toX : 移动到的位置
*/
private void scrollToTime(int startX,int toX) {
int dx = toX-startX;
//将移动的距离,拆分成一段一段的操作
//startX, startY : 开始的位置
//dx, dy : 移动的距离
//duration : 时间
scroller.startScroll(startX, 0, dx, 0, 1000);
invalidate();
}
//计算滑动的距离
@Override
public void computeScroll() {
//computeScrollOffset : 查看scroller是否将距离分成一段一段的
if (scroller.computeScrollOffset()) {
int currX = scroller.getCurrX();//获取一段一段的距离中的某一段
//移动某一段距离
myScrollTo(currX);
//移动完一段距离之后,还要移动下一段距离
invalidate();
}
super.computeScroll();
}
###根据移动的距离计算滑动的时间
cn.itcast.slidingmenu.ui.MySlidingMenu.java
private void scrollToTime(int startX,int toX) {
int dx = toX-startX;
//根据距离设置移动所花的时间
int scale = 1000 / menuWidth;
//根据移动的距离,获取滑动的时间
int time = scale * Math.abs(dx);
........
}
###手动打开关闭侧拉菜单
1.在自定义控件中创建手动打开关闭侧拉菜单的方法
cn.itcast.slidingmenu.ui.MySlidingMenu.java
/**
*
* @Description:手动打开关闭侧拉菜单
*/
public void toggle(){
//获取侧拉菜单移动的距离,如果是0表示没有移动,打开,如果是菜单页的宽度,表示打开的操作,关闭
//getScrollX();//返回的是正数,表示移动的是一个负值
if (myGetScrollX() == 0) {
//从0开始移动,打开侧拉菜单
distance = 0;
currentStart = menuWidth;
}else{
distance = menuWidth;
currentStart = 0;
}
scrollToTime(distance,currentStart);
}
2.在Activity中设置按钮的点击事件,调用方法进行操作
cn.itcast.slidingmenu.MainActivity.java
/**
*
* @Description:初始化控件
*/
private void initView() {
ImageView mBack = (ImageView) findViewById(R.id.back);
final MySlidingMenu slidingmenu = (MySlidingMenu) findViewById(R.id.slidingmenu);
mBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//打开关闭侧拉菜单
slidingmenu.toggle();
}
});
}
###事件传递机制 (重点!!!!!!!!!!!!!!!)
// 事件拦截操作
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// 判断如果是横向滑动,拦截事件,如果是竖向滑动,放开事件
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
downY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) ev.getX();
int moveY = (int) ev.getY();
int distanceX = moveX - downX;
int distanceY= moveY - downY;
if (Math.abs(distanceX) > Math.abs(distanceY)) {
//横向滑动
return true;
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}