以下に、 harism による Page Curl アクティビティの上にある RelativeLayout でテキストをアニメーション化するために実行しているスレッドのコードを投稿しています。
public void startProgress(final int index)
{
runnable = new Runnable()
{
@Override
public void run()
{
mArrWords.removeAll(mArrWords);
mStart.removeAll(mStart);
mEnd.removeAll(mEnd);
words = sentence.split(" ");
for(int i = 0; i < words.length; i++)
{
mArrWords.add(words[i]);
if(i == 0)
{
mStart.add(0);
mEnd.add(words[0].length());
}
else
{
mStart.add(mEnd.get(i-1)+1);
mEnd.add(mStart.get(i)+words[i].length());
}
/*Log.e("words", "" + "" + words[i]);
Log.e("mArrWords", "" + mArrWords);
Log.e("mStart", "" + mStart);
Log.e("mEnd", "" + mEnd);*/
}
for (int i = 0; i < mArrWords.size(); i++)
{
final int value = i;
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
mHandler.post(new Runnable()
{
@Override
public void run()
{
currIndex = index;
try
{
if(CurlView.ANIMATE)
tv1.setVisibility(View.VISIBLE);
else
tv1.setVisibility(View.GONE);
final Pattern p = Pattern.compile(mArrWords.get(value));
final Matcher matcher = p.matcher(sentence);
SpannableString spannableTxt = new SpannableString(sentence);
ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
while(matcher.find())
spannableTxt.setSpan(span, mStart.get(value), mEnd.get(value), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv1.setText(spannableTxt);
mHandler.sendEmptyMessage(0);
}
catch (Exception e)
{
e.printStackTrace();
mHandler.sendEmptyMessage(0);
}
}
});
}
}
};
final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
worker.schedule(runnable, CurlView.ANIMTIME+50, TimeUnit.MILLISECONDS);
}
ここでは、画像の上にテキストをアニメーション化しています。変更する各ページのテキストを変更する必要があります。テキストを変更することはできますが、ページをめくると、ArrayLists に保存したインデックス値がクリアされません。mArrWords という名前の ArrayList に文を格納しています。文の各単語を参照するインデックスは mStart と mEnd に格納されています。
私が直面している問題は、テキストが変更されたときです。アニメーションは、特定の単語のインデックスを格納するために使用する mStart および mEnd ArrayLists に格納されている以前のインデックスから始まります。私が知る必要があるのは、ページがめくられたとき、またはページのインデックスが変更されたときにスレッドを停止する方法です。Curl アクティビティの updatePage(final CurlPage page, final int width, final int height, final int index) メソッド内でこの関数を呼び出しています。私の問題を説明できたことを願っています。ありがとう!
編集:質問をより明確に指定したいと思います。別のスレッドを開始する前にスレッドが既に実行されているかどうかを確認し、前のスレッドの実行を停止するにはどうすればよいですか?