Android ListView平滑的滑动 smoothScrollTo
最近做环信IM,用的easeui 直接跳过自定义消息 接受离线消息的步骤。上面的说是环信当有新消息加入最下面的时候没有动画效果,让我改出滑动的效果出来,好吧 小意思 直接用 smoothScrollToPosition 就完事了。
but 几分钟之后 上面说是有滚动效果了 但是太快了 让我改慢一点
我是没有听说过 smoothScrollToPosition 可以设置时间的,于是不停地看ListView的源码,发现 smoothScrollToPosition 其实是调的 smoothScrollBy 方法,两个参数分别是 滑动的距离和时间 。
思路瞬间有了 计算出滑动的距离和时间 调用就完事了 下面贴出方法
int distanceHeight = 0;
for (int i = startIndex; i < length; i++) {
View listItem = getView(i, null, listView);
listItem.measure(0, 0);//取wrap_content的大小的高
distanceHeight += listItem.getMeasuredHeight();
}
listitem 就是通过position 获取到的itemView distanceHeight 就是itemView的高度
高度出来了时间也就快了 等等 要是之显示出部分的高度 不就 gg 了嘛
淡定 getChildAt 可以获取到可见的View 记住是可见的 GONE 也是不可见的,getChildAt后面跟一个int参数 这个int不是一般的position 而是可见的第几项 ,等到View之后通过getHeight()获取可见的高度 ,用getMeasuredHeight()减去getHeight() 就是不可见的高度了
高度已经计算完毕 调用 smoothScrollBy 愉快的让他滚吧
这里有点注意:smoothScrollToPosition 滚动到指定position显示到屏幕中 并不一定滚动到顶部
getMeasuredHeight 获取的是itemView 应该有的高度 而 getHeight 是获取可见的高度
总感觉更好的方法很多啊