2009-06-18 11 views
9

翻訳アニメーションを使用して、画面の左から右にImageViewをアニメートしています。 ImageViewは、FrameLayoutを使用してメインレイアウトの上にRelativeLayoutの内側に配置されています。アニメーションがトレイルを離れているのはなぜですか?

エミュレータでアニメーションを実行すると、すべて正常に動作しますが、G1で実行すると、ビジュアルアーチファクトが残り、その背後のテキストコンポーネントのレンダリングに影響します。

これはパフォーマンス上の問題ですか、私はあまりにも野心的ですか、それとも克服できるバグですか?

性能上の問題がある場合は、改善のためにできることはありますか?

+4

で、あなたのビューを再描画したい1選びますあなたは私たちが見るためのコードを提供できますか?フレームレイアウトで他に何かしていますか?使用しているSDKのバージョン(cupcake?) – jamesh

+0

これは使用しているクラスですか? http://developer.android.com/reference/android/view/animation/TranslateAnimation.html –

+0

良い質問ですが、私もこの問題を抱えていますが、それはエミュレータにも表示されます! FrameLayoutのビューの3D回転をアニメーション化するとき、おそらくFrameLayoutの関数/バグでしょうか?私はサーフェイスビューを使用できるかどうかを調べるつもりです。 – Andy

答えて

3

は、私は今、これは少し古いかもしれませんが、私はこの発見:あなたが使用してAndroidのバージョンは何わからない

http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation+leaves+trails#e750730b9953d9a8

を、それはアンドロイドのライブラリのバグかもしれません!

これは私の問題なのですか? :)

...ドントチャは、あなたのせいではないときにそれを愛する! :D

+0

ほぼ確実です。私はそのアニメーションをあきらめ、トレイルを残さないものに行った。 –

0

次のフレームを書き込む前に表示バッファをクリアしていないような問題は実際には見えません。それは私にとってパフォーマンスの問題のようには聞こえません。

デバイスがダブルバッファリングを実行するかどうかを制御できますか?

これはエミュレータで問題が発生した場合、エミュレータの問題またはエミュレータに表示されないコードのバグ(これは技術的にはエミュレータの問題ですパフォーマンスの問題よりも

+0

Androidフレームワークで提供されているアニメーションフレームワークを使用しているため、ダブルバッファリングやディスプレイバッファの制御はできません。 私にはバグのようです。私の要求があまりにも野心的であるため、これがパフォーマンス上の問題であった場合、アニメーションはちょっとぎこちなく/低いフレームレートしかないはずです。それは合理的にうまくいきます。それは、その背後にある画像のように見えます。彼らはかなり迅速にきれいにされますが、それは良く見えません。 –

+0

@Tom - 私は私が提案できるものの限界に達したと思う。私はあなたが開発している環境を本当に知っていませんが、何年もの間リアルタイム3Dグラフィックスを扱っていたアニメーションを知っていますし、同様の問題を抱えています。しかし、私が言ったように、実際に何が起こっているかを見ることなく、問題を診断するのは難しいです。 – ChrisF

0

アニメーションにはSurfaceViewを使用することをおすすめします。ダブルバッファーなので、正しく使用するとちらつきがなくなります。例が必要な場合は、sdkに含まれているLunarLanderデモでこれを実にうまく表示します。また、コードに関するより具体的な質問がある場合は、遠ざかりましょう。

一般的なAndroidのパフォーマンスについては、かなり高いフレームレートを持つことは非常に可能であり、あまり期待していません。

0

これは私にとっても起こります。私はGoogle APIで1.6を使用するエミュレータを使用していますが、FRF83を実行しているNexus Oneでエミュレータが動作することを確認しました。ここでは、関連するコードがあります:

Animation a = new TranslateAnimation(0.0f, 0.0f, 100.0f, 0.0f); 
a.setDuration(2000); 
this.myView.startAnimation(a); 

ここでビューをインスタンス化するため、関連するコードは次のとおりです。

View v = new View(this.getApplication()); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 80); 
v.setLayoutParams(params); 
v.setBackgroundColor(0xFFFF0000); 
// 
LinearLayout layout = (LinearLayout)this.findViewById(R.id.theLayout); 
layout.addView(v); 
// 
v.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     doAnimation(); 
    } 
}); 
// 
myView = v; 

だから基本的には、ダブルバッファリングなどは、OSによって処理されている、と私はそれを制御することはできませんまったく。

0

私はAndroid 2.3でも同様の問題があったため、まだバグが存在する可能性があります。 透明部分があるPNGでImageViewを使用していました。この画像ビューは、TranslateAnimationでアニメーション化されたときに軌跡を残していました。イメージビューに偽の背景drawableを使用すると、私は背景としてdrawableを使いました。

10

私は2.3でも同じ問題が発生していました。

Animation.applyTransformationのムービングビューのコンテナ(ムービングビューが配置されているレイアウト)を無効にして、私のために修正しました。

参照:

Android - Artifacts using Animation

+0

この古い質問に対する別の解決策を報告してくれてありがとうMatthijs ... –

+0

あなたはちょうど私の日を救った。ありがとうございました:) –

2

ここでは私のためにこれを解く私が見つけた回避策はあります:「簡単な回避策は、小型であなたのイメージに透明領域を(1個のピクセルがそれを行う必要があります)パッドになります右/下 - これはどのように見えるかには何の影響もありませんが、実際の画像よりもわずかに大きい領域の無効化が強制され、バグを補うことになります。

http://code.google.com/p/android/issues/detail?id=22151

+0

これまでのところ、最も簡単な解決策です。ありがとう! –

+0

これは動作します。主なアンドロイドのデベロッパーの一人が、それが以前に修正されたと書きましたので、なぜそれが起こるのかわかりません:http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation +葉+道#e750730b9953d9a8 –

+0

非常に興味深い!私は、実際の濃度から濃度に依存しないピクセルへの変換のために、これが機能していると推測しています。目に見えないリングは、なんらかの汚れを説明します。 –

0

私はいくつかのアニメーションを実行している間、私はギャラリービューでこれを経験していたゼリービーンでこれを考え出しました。これは、より多くの描画の問題ではないCPUのように見えます....

あなたの活動は、インタフェースAnimatorListenerを実装します.....以下のメソッドをオーバーライドし、

@Override 
public void onAnimationEnd(Animator animation) { 
    // TODO Auto-generated method stub 

    mView.requestLayout(); 
    Toast.makeText(this, "animation ended", 0).show(); 
} 

@Override 
public void onAnimationRepeat(Animator animation) { 
    // TODO Auto-generated method stub 
    mView.requestLayout(); 
} 

@Override 
public void onAnimationStart(Animator animation) { 
    // TODO Auto-generated method stub 
    mView.requestLayout(); 
} 
関連する問題