VelocityTracker() {? ? ? ? if(null != mVelocityTracker) {? ? ? ? ? ? mVelocityTracker.clear();? ? ? ? ? ? mVelocityTracker.recycle();? ? ? ? ? ? mVelocityTracker = null;? ? ? ? }? ? }? ? /** ? * ? *:模拟动画过程,让肉眼能看到滚动的效果 ? * ? */ ? class showMenuAsyncTask extends AsyncTask ? { ? ? ? ? @Override ? ? ? protected Integer doInBackground(Integer... params) ? ? ? { ? ? ? ? ? int leftMargin = menuParams.leftMargin; ? ? ? ? ? while (true) ? ? ? ? ? {// 根据传入的速度来滚动界面,当滚动到达左边界或右边界时,跳出循环。 ? ? ? ? ? ? ? leftMargin += params[0]; ? ? ? ? ? ? ? if (params[0] > 0 && leftMargin > 0) ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? leftMargin= 0; ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? } else if (params[0] < 0 && leftMargin <-menuParams.width) ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? leftMargin=-menuParams.width; ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? } ? ? ? ? ? ? ? publishProgress(leftMargin); ? ? ? ? ? ? ? try ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? Thread.sleep(40);//休眠一下,肉眼才能看到滚动效果 ? ? ? ? ? ? ? } catch (InterruptedException e) ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? ? } ? ? ? ? ? } ? ? ? ? ? return leftMargin; ? ? ? } ? ? ? @Override ? ? ? protected void onProgressUpdate(Integer... value) ? ? ? { ? ? ? ? ? menuParams.leftMargin = value[0]; ? ? ? ? ? menuLayout.setLayoutParams(menuParams); ? ? ? } ? ? ? ? @Override ? ? ? protected void onPostExecute(Integer result) ? ? ? { ? ? ? ? ? menuParams.leftMargin = result; ? ? ? ? ? menuLayout.setLayoutParams(menuParams); ? ? ? } ? ? } }
三、效果与说明
侧滑菜单在很多应用中都会见到,其实实现起来原理非常简单,只不过是要有一大堆的判断,你要判断手指移动的距离和方向,还要判断手指移动的速度。所以代码写出来可能有点儿多,但是原理了解了就不难了。另外,为了滚动效果肉眼可以看到,加了个showMenuAsyncTask类,它在滚动视图的过程中,每sleep(40)然后再滚动,当然,这里时间还可以改到一此,效果会更加好。

|