0

ListViewのアイテムの一部であるTextViewをフェードイン/フェードアウトするためのある種のエレガントなソリューションを見つけようとしています。

コンテキストを示すために、リストビューにはバスケットボールゲームのプレーヤーのリストが表示されます。ユーザーは名前をタップすると、そのプレーヤーのショットやファウルなどのイベントをログに記録するためのダイアログが表示されます。ダイアログが閉じられると、ユーザーはリストビューに戻ります。ここで、ログに記録されたばかりのイベントに関するフィードバックを提供したいと思います。

私がやりたいのは、タップしたばかりのアイテム(プレイヤー)のビューに小さな文字列を約5秒間表示することです。小さな文字列には、「3回目のファウル」や「4回のターンオーバー」などが表示されます。

素朴な実装は簡単です。ビューのテキストを必要な文字列に変更してから、ビューでフェードインするアニメーションを開始し、しばらくそこに保持してからフェードアウトします。ただし、同じプレーヤーの2番目のイベントが最初のイベントの直後にログに記録されると、問題が発生します。理想的には、最初のフィードバックストリングは、割り当てられた5秒間そのままにして、2番目のストリングは次の5秒間でフェードイン/フェードアウトする必要があります。

このアニメーションとテキストのキューイングは、プレーヤーごとに変更されます。実装方法がよくわかりません。さらに、アニメーションとアクティビティのライフサイクルの間の相互作用が心配です。アクティビティがバックグラウンドに送信されたり、停止されたり、メモリから削除されたりすると、キューに入れられたアニメーションはどうなりますか(または発生するはずです)?または、リストビューの背後にある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 に答える