SlidingMenu作为一个开源的侧滑菜单库相信大家已经很熟悉了,只是已经很久没有更新了。有一天我看到主Fragment上的头像可以随着手指的滑动改变透明度,例如:手机QQ中,用户的头像。紧接着我就开始寻找SlidingMenu里面是否有这样的监听。但很遗憾,我仅仅找到了以下几个监听方法.
private OnOpenListener mOpenListener; private OnOpenListener mSecondaryOpenListner; private OnCloseListener mCloseListener;
这样就很尴尬了,完全没有办法实现我们需要的效果。
于是经过我的摸索,首先我想到的是既然是滑动,肯定会有相关的滑动距离之类的数据,于是全局搜索ScrollTo方法,结果也没有搜索到相关方法。
不过“山重水复疑无路,柳暗花明又一村”,发现了ViewPager的相关监听,那么我就从此下手进行了相关的改造。
首先,这里的三个参数:
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
,分别表示了当前ViewPager的Index,ViewPager当前页的滑动比例和当前华东的像素值,好的,知道了我们可以获得的数据之后,接下来就是相关的比例计算了。
然后我想到可以通过获取当前设备的宽度,然后减去用户设置的可滑动距离:即可得到可滑动的距离,在这个值得到了之后我们便可以根据其滑动距离除以总的距离得到当前的滑动比例啦!
那么怎么获取屏幕的宽度呢?
开始我是打算写在
slidingMenu.setBehindOffset(200);
public void setDeviceDistance(int i) { deviceDistance = i; }
,用来获取当前的屏幕宽度,当然了,具体的获取方法需要在主Activity中传递过来:
slidingMenu.setDeviceDistance(DeviceUtil.getMetricsWidth(MainActivity.this));
这样就可以了,至于具体怎样获得设备宽度,代码贴在这里了:
/** * @param context 上下文 * @return int * @brief 获取手机屏幕尺寸 宽度 */ public static int getMetricsWidth(Context context) { // String str = ""; DisplayMetrics dm = new DisplayMetrics(); dm = context.getResources().getDisplayMetrics(); int screenWidth = dm.widthPixels;// 屏幕高(像素,如:800px) return screenWidth; }
哈哈,这样就可以进行比例运算了:
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { double scalePercentage = (positionOffsetPixels * 1.0 / (deviceDistance - distance) * 1.0) * (-1); //获得了百分比 // Log.d("slidingtest", scalePercentage + ",,," + deviceDistance + "," + positionOffset + "" + "mmm" + positionOffsetPixels + ""); }
因为是Integer类型的数据源需要除出来小数,这样进行处理了。
接下来就是暴露接口给用户进行调用了:
首先声明一个接口:
//获得Scale的接口 private OnScaleListenet mOnScaleListenet; public interface OnScaleListenet { public void onScale(double scale); }
紧接着我们来写一个set接口的方法:
public void setOnScaleListenet(OnScaleListenet mOnScaleListenet) { this.mOnScaleListenet = mOnScaleListenet; }
准备工作做完了,下面就是把参数传递给调用它的地方了(回调方法):
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { double scalePercentage = (positionOffsetPixels * 1.0 / (deviceDistance - distance) * 1.0) * (-1); mOnScaleListenet.onScale(scalePercentage); //获得了百分比 // Log.d("slidingtest", scalePercentage + ",,," + deviceDistance + "," + positionOffset + "" + "mmm" + positionOffsetPixels + ""); }
,这样就可以在调用的地方拿到百分比了。
最后一步,调用:
slidingMenu.setOnScaleListenet(new SlidingMenu.OnScaleListenet() { @Override public void onScale(double scale) { LogUtil.d("slidingtest", scale+""); } });
我们来看看Log打印的结果:
中间省略一万行。。。
是一个完整的0-1的变化过程。就这样大功告成了!
修改后的源码地址:
https://github.com/yeluowuhen502/MySlidingMenu