android - 使用setX,setPadding或补间动画幻灯片ListView?

时间:2013-02-03 21:54:49

标签: android listview android-animation slide tween

我没有详细介绍,我希望能够在ListView中'滑动'元素,类似于GMail中的'幻灯片存档'功能。我对onTouchListener很好,所有这些,我的问题是关于幻灯片动画。

首先想到的两件事是......

view.setPadding(slideOffset, 0, 0, 0);

和..

view.setX(slideOffset);

前者是非常黄油,即使在模拟器上也是如此 后者在我的Galaxy Nexus上有点笨拙。

我的问题:
*无论我尝试过什么,这样做的正确方法是什么? 为什么setX不如setPadding平滑? 一种方法是否比其他方法更符合Android最佳实践? 补间翻译动画是一种选择吗?如果是这样,你能提供一个简短的例子来指出我正确的方向吗?

修改
为了清楚起见,我附上了我试图效仿的效果图像。

enter image description here

3 个答案:

答案 0 :(得分:1)

我很确定setX()速度较慢,因为它影响了它的父节点。更改视图的X时,每次更新值时,它都会调用父级的onLayout / onMeasure。这是因为孩子的X值可能导致父母的其他项目移动,因此父母需要重绘自己。

您可以通过扩展ViewGroup并写入这些方法的日志来轻松测试。然后,您可以使用两种方法,padding与setX,并查看会发生什么。

您是否尝试为该项目制作动画?或者您希望用户像在Gmail上一样移动它吗?您可以使用ObjectAnimator处理项目的“X”值。结合物品的“硬件层”,它将创造更流畅的体验。您可以在此处找到有关如何执行此操作的详细信息:http://developer.android.com/guide/topics/graphics/hardware-accel.html

答案 1 :(得分:1)

是的,如果您要定位更高的API,ViewPropertyAnimator可能是一个很好的解决方案。如果你必须支持较低的API,我的实施思路将是(我自己也没有亲自实现,但这应该对性能有益):

  1. 在您的触摸处理程序中,一旦您确定用户正在"滑动",请将View的可见性设置为INVISIBLE,并将绘图缓存存储到单独的位图(位图bmp = myView.getDrawingCache();)

  2. 在与视图相同的位置绘制该位图,并使用Canvas转换方法根据用户触摸点的x位置移动位置。

  3. 用户放手后,转回(最好用动画平滑),回收位图,然后将视图设置回可见。

答案 2 :(得分:1)