如何fling一个ListView

来源:互联网 发布:java jdk有安卓版的吗 编辑:程序博客网 时间:2024/05/17 03:09

为什么要fling

    与fing(int velocity)对应的有个函数叫scrollBy(int x,int y),它们的区别比较明显,

首先fing的参数是velocity,是滑动开始的初速度;scrollBy的参数则是滑动的距离;

两个函数效果也不一样,fing函数有慢慢减速的效果,而scrollBy是直接平移的;

如果要用手势的初速度滑动那就要fling,

如果要有滑动慢慢减速的顺滑效果那也需要fling;


如何对ListView fling

listview的fling函数天生残缺,只有在sdk api版本在21之后(包括21)才有fling函数,

所以直接使用fling函数要做判断:

if(Build.VERSION.SDK_INT>20){listView.fling(velocity);}

要在老版本做兼容的话就需要使用发射,把控制ListView的mFlingRunnable对象拿出来用,

mFlingRunnable有fling的方法,但mFlingRunnable只有在ListView滑动后才会生成,

否则取出来是null。

所以还需要有个生成mFlingRunnable步骤,可以手动调用smoothScrollBy引起ListView滑动:

smoothScrollBy(2, 10);//smoothScrollBy a little distants to instants mFlingRunnabletry{Field flingRun = AbsListView.class.getDeclaredField("mFlingRunnable");flingRun.setAccessible(true);String methodStr = "startOverfling";Log.e("selfFling", "velocity="+velocity);Method flingMethod = flingRun.getType().getDeclaredMethod(methodStr, int.class);flingMethod.setAccessible(true);flingMethod.invoke(flingRun.get(this), velocity);Log.e("selfFling invoke", "velocity="+velocity);}catch (Exception e) {e.printStackTrace();// TODO: handle exception}

这样我们就能在各个版本使用ListView的fling函数了

这个开源项目里包含了这些方法的使用

https://github.com/smallnew/PullFling

0 0
原创粉丝点击