0

我试图找到某种优雅的解决方案来淡入/淡出作为 ListView 中项目的一部分的 TextView。

为了给您一些背景信息,列表视图显示了篮球比赛中的球员列表。用户点击一个名字,并提供一个对话框来记录事件,例如该球员的射门或犯规。一旦对话框被关闭,用户就会被带回列表视图,在这里我想提供一些关于刚刚记录的事件的反馈。

我想做的方式是在刚刚被点击的项目(播放器)的视图中出现一个小字符串大约 5 秒钟。小字符串会显示类似“第 3 次犯规”或“4 次失误”的信息。

一个简单的实现很简单。将视图的文本更改为所需的字符串,然后开始在视图中淡入淡出的动画,将其保留一段时间然后淡出。但是,当同一玩家的第二个事件在第一个事件之后不久记录时,就会出现问题。理想情况下,应允许第一个反馈字符串保留分配的 5 秒,第二个字符串应在接下来的 5 秒内淡入/淡出。

这种基于每个玩家的动画和文本队列变化我不太确定如何实现。此外,我还关心动画和 Activity 生命周期之间的交互。当活动被发送到后台、停止甚至从内存中删除时,排队的动画会发生(或应该发生)什么?或者当一个项目从列表视图后面的 ArrayAdapter 中删除时?

想法?

马努

4

1 回答 1

1

不要担心活动的生命周期。不会有不良影响。但是,如果活动在动画期间进入后台,则动画将发生,您将看不到它。

至于让一个动画等待下一个,只需这样做:

// here we will keep track of any listView and when the last animation took place.
// The keys will be your listView identifiers. Here I assumed an integer, but use whatever is a good ID for your listView
private HashMap<Integer, Long> listViewLastAnimations;

// the length of the animation in milliseconds
private static long ANIMATION_LENGTH_MS = 5000;

// put this code where  you would start your animation
// get when the last event animation occurred
Long lastAnimation = listViewLastAnimations.get(YOUR_LIST_ITEM_IDENTIFIER);
Date new = new Date();
if (lastAnimation == null ||
   new.currentTimeMillis () - lastAnimation > ANIMATION_LENGTH_MS ){
listViewLastAnimations.put(YOUR_LIST_ITEM_IDENTIFIER, new.currentTimeMillis ());
// perform animation as normal
}else{
// set a delay to your animation with
long delay = ANIMATION_LENGTH_MS - (new.currentTimeMillis () - lastAnimation);
listViewLastAnimations.put(YOUR_LIST_ITEM_IDENTIFIER, new.currentTimeMillis () + delay);
setStartOffset(delay) ;
}
于 2012-05-22T23:01:31.493 回答