2011-12-28 13 views
2

私はAndroidのアニメーションに非常に奇妙な問題があります。多くの異なるアプローチやコンポーネントを試しましたが、まだ説明が見つかりませんでした。FrameLayoutのビューをすばやく切り替えてアニメーション化するとビューがぼやけます

私は、ビューのコンテナであるFrameLayoutと、ボタンを持っています。

この でframeLayoutは、一度に つのビューを表示しなければならない、と私は ボタンをクリックしたとき、私は 表示別のビューにでframeLayoutをしたい、と ビューにアニメーションを開始 それはFrameLayoutから削除されたです。

ここでの具体性は、は2つのビューのみを使用しており、これらの2つのビューを切り替える必要があるということです。

問題は:私は複数回が本当に速いボタンをクリックして、クリック停止すると

、二つのビューは、上から他に同時に1に示され、そして消えません。コンテナにはまだ1つのビューしか含まれていませんが...間違いなく奇妙です!

error screenshot http://i.minus.com/jDXyvUsE1LCOx.png

私は簡単な例でこれを再現することができた:あなたは以前のものはまだ実行されている、と道Iされている間のアニメーションは、ビュー上で起動されている見ることができるように

public class TestAnimActivity extends Activity implements OnClickListener { 

private FrameLayout container; 

private TextView current; 
private TextView next; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    current = new TextView(this); 
    current.setText("View 1 YEAH"); 
    next = new TextView(this); 
    next.setText("  View 2 DOH"); 

    container = (FrameLayout) findViewById(R.id.container); 
    container.addView(current); 

    findViewById(R.id.button).setOnClickListener(this); 
} 

public void onClick(View v) { 
    Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
    current.startAnimation(outAnimation); 
    container.addView(next); 
    container.removeView(current); 

    TextView temp = current; 
    current = next; 
    next = temp; 
} 
} 

それは何とか問題の原因になるかもしれません。

私はアニメ関連のコードをコメントしている場合、それは完璧に動作します:「

// next = temp; 
next = new TextView(this); 
next.setText("View: " + new Random().nextInt()); 

しかし、私はドン:私は再利用ビューを停止し、代わりに新しいビューを作成する場合は、それも完璧に動作

// Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
// current.startAnimation(outAnimation); 

新しいビューを作成したい:-)

この問題は、親からこのビューを追加/削除しているときに、ビューを何度かアニメーションを開始することに関連しているようです。

私が最初にViewAnimatorViewFlipper、と試してみました、そして、Androidのソースコードを見て、問題を再現するために、手動でこれをやってしまいました。

あなたはレイアウトが自分でテストすることができるようにしたい場合は、ここで私のmain.xmlです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Click me fast" /> 

</LinearLayout> 

はお時間をいただき、ありがとうございます!

答えて

5

私はついにこの問題を解決する方法を見つけました。

ビューグループからビューを削除すると、このビューで実行中のアニメーションがある場合、ViewGroupの「消えている子」リストに自動的に追加されます。

私たちがViewGroupに削除されたビューを削除しようとしたときに表示されたように見えましたが、まだ消えている子に残っていました。

それを修正する簡単な方法があります:viewGroup.clearDisappearingChildren();ここ

onClick()メソッドの新しい実装次のようになります。答えるため

public void onClick(View v) { 

    next.clearAnimation(); 
    container.clearDisappearingChildren(); 

    Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
    current.startAnimation(outAnimation); 
    container.addView(next); 
    container.removeView(current); 

    TextView temp = current; 
    current = next; 
    next = temp; 
} 
+0

これに答える時間をとっていただきありがとうございます。私はギャラリーを更新しているところに似た問題がありました。フォーカスされたアイテムはアニメーションを使って拡大していました。しかし、私がギャラリーを更新するときはいつでも、それは前のイメージを見ることができます。 – Steve

0

ボタンをすばやく押すことなく動作し、アニメーションなしで動作する場合は、アニメーションが実際にどのように動作するかがわかります。私の理解から、アニメーションに表示される内容は、アニメーション化しているViewオブジェクトとは別物です。追加したり削除したりするのではなく、親ビューからアニメーションを試すことができます。または、ビューを削除する前にアニメーションをクリーンアップしてください。表示されているファントムイメージを削除できるonAnimationEndメソッドをビューが取得できないように聞こえます(setFillAfter(false)、これはアニメーションのデフォルト動作です)。 )。

+0

感謝:)。あなたはきれいにするというアイデアは大丈夫​​でしたが、清掃する必要があったのは、容器が消えていく子供たちでした。 –

+0

素敵な仕事、あなたの問題を解決できるとうれしい。 –

関連する問題