Android滑动菜单特效(半路上停下来了)

显示菜单时

隐藏菜单时

public class MainActivity extends Activity implements OnTouchListener {
/***
* 菜单栏左边距 注:菜单栏左边与屏幕X坐标的位置
**/
private int leftEdge = 0;
/***
* 菜单栏右边距 注:菜单栏右边与屏幕X坐标的位置
**/
private int rightEdge = 0;
/*** 菜单栏 ***/
private LinearLayout menu;
/**** 主界面 ***/
private LinearLayout content;
/*** 屏幕的宽度 ***/
private int disWidth;
/**** 主界面最小显示的大小 ***/
public static final int PADDING_DISTANCE = 80;
/*** 菜单栏的布局参数 **/
private LinearLayout.LayoutParams leftLayoutParams;
private float xDown = 0;
private float xMove = 0;
private float xUp = 0;
private boolean flag = false;
/*** 最低的划动速度 ***/
public static final int VELOCITY = 200;
/*** 速度记录跟踪器,专业记录onTouch()点击事件 *****/
private VelocityTracker velocityTracker;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取屏幕的宽度
DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
disWidth = metrics.widthPixels;
menu = (LinearLayout) findViewById(R.id.menu);
leftLayoutParams = (LayoutParams) menu.getLayoutParams();
// 菜单栏宽度
leftLayoutParams.width = disWidth - PADDING_DISTANCE;
// 菜单栏左边距
leftEdge = -leftLayoutParams.width;


// 菜单栏距屏幕左边X坐标的位置
// 注:默认的菜单栏是不可见的
leftLayoutParams.leftMargin = leftEdge;
Log.i("TAG", "leftEdge=" + leftEdge + ",disWidth=" + disWidth);
// 默认显示主内容界面
content = (LinearLayout) findViewById(R.id.content);
content.getLayoutParams().width = disWidth;
content.setOnTouchListener(this);
}


/**** Gesture的onFling()实现了 *****/
@Override
public boolean onTouch(View view, MotionEvent event) {
// 创建一个速度记录跟踪器
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}
velocityTracker.addMovement(event);


switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = event.getRawX();
Log.i("TAG", "xDown=" + xDown);
break;
case MotionEvent.ACTION_MOVE:
xMove = event.getRawX();
Log.i("TAG", "xMove=" + xMove);
int distance = (int) (xMove - xDown);
if (flag) {// 隐藏显示菜单栏
leftLayoutParams.leftMargin = distance;
} else {// 显示菜单栏
leftLayoutParams.leftMargin = leftEdge + distance;
}
// 完全显示菜单栏时,不再向右移动
if (leftLayoutParams.leftMargin > rightEdge) {
leftLayoutParams.leftMargin = rightEdge;
// 当菜单完全的隐藏后,并且距屏幕左边X坐标位置小于当前菜单的宽度时,不在移动
} else if (leftLayoutParams.leftMargin < leftEdge) {
leftLayoutParams.leftMargin = leftEdge;
}
// 不加这句,不会出现效果
menu.setLayoutParams(leftLayoutParams);
break;
case MotionEvent.ACTION_UP:


xUp = event.getRawX();
Log.i("TAG", "xUp=" + xUp);
// 向右划动,显示菜单(菜单未显示时)
if (xUp - xDown > 0 && !flag) {
if (xUp - xDown > disWidth / 2 
|| getVelocity() > VELOCITY) {
Log.i("TAG", "result=" + (xUp - xDown));
// 划动的速度大于200
// if (Math.abs(velocity) > VELOCITY) {
// 更新UI主线程,显示菜单栏
new MyAsyncTask().execute(30);
// }
// 向左划动,隐藏菜单栏(菜单显示时)
}
} else if (xDown - xUp > 0 && flag) {
if (xDown - xUp + PADDING_DISTANCE > disWidth / 2 
|| getVelocity() > VELOCITY) {
Log.i("TAG", "result=" + (xUp - xDown));
// int velocity = (int) velocityTracker.getXVelocity();
// Log.i("TAG", "向左划动:velocity=" + velocity);
// if (Math.abs(velocity) > VELOCITY) {
// 更新UI主线程,隐藏菜单栏
new MyAsyncTask().execute(-30);
// }
}
}
// 收回速度记录跟踪对象
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
break;
}


return true;
}


private int getVelocity() {
velocityTracker.computeCurrentVelocity(1000);
int velocity = (int) velocityTracker.getXVelocity();
Log.i("TAG", "velocity="+velocity);
return Math.abs(velocity);
}


/*** UI更新时的效果 ****/
private class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {


@Override
protected Integer doInBackground(Integer... steps) {
// 更改距屏幕左边X坐标位置
int leftMargin = leftLayoutParams.leftMargin;
while (true) {
leftMargin = leftMargin + steps[0];


// 判断菜单栏是否完全显示或者隐藏,如果完全显示或者隐藏时就退出循环
// 菜单栏的完全显示
if (leftMargin > rightEdge) {
leftMargin = rightEdge;
break;
// 菜单栏完全隐藏
} else if (leftMargin < leftEdge) {
leftMargin = leftEdge;
break;
}
// 通知菜单栏的边距更新了
publishProgress(leftMargin);
// 线程睡眠20毫秒
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (steps[0] > 0) {
flag = true;
} else {
flag = false;
}
return leftMargin;
}


@Override
protected void onProgressUpdate(Integer... values) {
leftLayoutParams.leftMargin = values[0];
menu.setLayoutParams(leftLayoutParams);
}


@Override
protected void onPostExecute(Integer result) {
leftLayoutParams.leftMargin = result;
menu.setLayoutParams(leftLayoutParams);
}
}


}



下载地址:http://download.csdn.net/detail/util_c/5735095

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值