私は4つ持っていTextViews
ます。それらはすべて目に見えないところから始まり、私はそれらを画面上でアニメーション化しています(下からスライドします)。スレッドを開始して、それぞれをアニメーション化し、200ミリ秒後に開始します。問題は、アクティビティの開始後に初めてTextViewをアニメーション化するときに、遅れるということです。しかし、後でもう一度アニメーション化しても、アニメーション化されません。また、ランダムに遅れることもありますが、それほど頻繁ではありません。これを防ぐ方法があるかどうか疑問に思っています。私は1台の電話でしかテストしていないので、そうかもしれませんが、アクティビティを開始した後の最初のアニメーションでのみ発生するのは奇妙です。
animatingGroup = 0;
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
while (animate) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
public void run() {
Animation slideInAnim = AnimationUtils
.loadAnimation(getApplicationContext(),
R.anim.slide_in_from_bottom);
switch (animatingGroup) {
case 1:
tv1.startAnimation(slideInAnim);
tv1.setVisibility(View.VISIBLE);
break;
case 2:
tv2.startAnimation(slideInAnim);
tv2.setVisibility(View.VISIBLE);
break;
case 3:
tv3.startAnimation(slideInAnim);
tv3.setVisibility(View.VISIBLE);
break;
case 4:
tv4.startAnimation(slideInAnim);
tv4.setVisibility(View.VISIBLE);
animate = false;
break;
}
animatingGroup++;
}
});
}
}
};
new Thread(runnable).start();
そしてここにアニメーションがあります:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="800"
android:toYDelta="0%"
android:fromYDelta="100%p" />
</set>
slideInAnim Insiderハンドラーを作成しないでください。地獄のようなリソースを消費します。一度作成してみてください...おそらく、onCreate()で
編集:これは私の意見では、あなたが達成したいことを行うためのクリーンで簡単な方法です:
Textviewsを配列に入れます:
TextView[] textViews = new TextView[]{tv1,tv2,tv3,tv4};
アニメーションを処理するforループを作成しますstartOffset:
int startOffset = 200;
for(int i=0; i < textViews.length(); i++){
animSlideIn.setStartOffset(startOffset);
textViews[i].setVisibility(View.Visible);
textViews[i].startAnimation(animSlideIn);
startOffset = startOffset + 200;
}
そうすれば、新しいスレッドとハンドラーの実行可能なものを切り取り、多くのコードを節約できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加