5

在不涉及太多细节的情况下,我希望能够以ListView类似于 GMail 中的“滑动存档”功能的方式“滑动”元素。我对 onTouchListener 和所有这些都很好,我的问题是关于幻灯片动画。

首先想到的两件事是..

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

和..

view.setX(slideOffset);

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

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

编辑:
为了清楚起见,我附上了我试图模仿的效果的图像。

在此处输入图像描述

4

3 回答 3

1

我很确定 setX() 速度较慢,因为它会影响其父母。更改视图的 X 时,每次更新值时都会调用父级的 onLayout/onMeasure。那是因为child的X值可能会导致parent上的其他item移动,所以parent需要自己重绘。

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

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

于 2013-02-06T01:37:55.217 回答
1

是的,如果你的目标是更高的 API,ViewPropertyAnimator 可能是一个很好的解决方案。如果您必须支持较低的 API,我对实现的思考过程将是(我自己并没有亲自实现,但这应该对性能有好处):

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

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

  3. 用户放手后,翻译回来(最好用动画平滑),回收位图,并将视图设置回 VISIBLE。

于 2013-02-06T01:43:33.617 回答