2013-02-03 8 views
5

あまり詳しく説明しなくても、私はListViewの要素を「スライドさせてアーカイブする」GMailに似ています。私はonTouchListenerとすべてのことでいいです、私の質問は、スライドのアニメーションに関するものです。android - setX、setPadding、またはtweenアニメーションを使用したスライドリストビュー?

頭に浮かぶ最初の二つのことをしている..

view.setPadding(slideOffset, 0, 0, 0); 

と..

view.setX(slideOffset); 

前者はさえエミュレータ上で、非常にバターです。
後者はギャラクシーネクサスのビットジャンクです。

私の質問:
*かかわらず、私が試したものの、これを行うための正しい方法は何ですか?
なぜsetXsetPaddingより滑らかではありませんか?
1つのアプローチは、Androidのベストプラクティスに他のものよりも合致していますか?
トゥイーン変換アニメーションはオプションですか?もしそうなら、正しい方向に私を向けるための簡単な例を教えてください。

編集:
明確にするために、私は私がエミュレートしようとしている効果の画像を添付しています。

enter image description here

+0

私はこれに対して賞金を稼ぐつもりです。私はこの問題に良い答えがないかどうか、または私がちょうど正しい質問をしていないかどうかはわかりません。多分、洗練されたソリューションが時間内に現れるでしょう。 –

答えて

1

私はそれがその親に影響を与えるため、SETX()が遅いかなり確信しています。ビューのXを変更すると、値を更新するたびに親のonLayout/onMeasureが呼び出されます。これは、子のX値が親の他の項目を移動させるため、親がそれ自身を再描画する必要があるからです。

ViewGroupを拡張し、それらのメソッドのログに書き込むことで、これを簡単にテストできます。次に、パディングとsetXの両方の方法を使用して、何が起こるかを確認できます。

アイテムをアニメートしようとしていますか?または、ユーザーがGmailのように移動するようにしますか? ObjectAnimatorを使用してアイテムの「X」値を処理できます。あなたのアイテムに「ハードウェアレイヤー」を組み合わせれば、よりスムーズな体験が可能になります。これを行う方法の詳細については、こちらをご覧ください。http://developer.android.com/guide/topics/graphics/hardware-accel.html

+0

これはonLayout/onMeasure呼び出しについて多くの意味を持つようです。これを回避する方法があるのでしょうか、それとも代わりにパディングを使用する理由になりますか?または、ちょうどハックを埋めるのですか? 私はアイテムがユーザーの指に従うことを好むので、アニメーションは必要ありません。タッチ位置をたどるなど、目標位置が絶えず変化している場合、ObjectAnimatorは適切ですか? –

+0

この場合、アニメーションは適切なアプローチではありません。アイテムの「ハードウェアレイヤー」を作成してみることもできます。これにより、GPUを移動する際にGPUを簡単に描画できます。完了後にレイヤーを削除することを忘れないでください。 どのように行ったか教えてください。 – Udinic

1

もっと高いAPIをターゲットにしている場合は、おそらくViewPropertyAnimatorが最適なソリューションです。あなたは下のAPIをサポートする必要がある場合は、実装のための私の思考プロセスは次のようになります(と私は個人的にこれを自分で実装していないが、これは、パフォーマンスのために良いことがあります)に:あなたと、あなたのタッチハンドラで

  1. ビューの可視性をINVISIBLEに設定し、描画キャッシュを別個のビットマップに格納することを決定しました(ビットマップbmp = myView.getDrawingCache();)

  2. ビットマップを同じ場所に描画しますキャンバスの翻訳メソッドを使用して、ユーザーのタッチポイントのx位置に応じて位置を移動します。

  3. ユーザーが移動した後、アニメーションでスムーズに戻って翻訳し、ビットマップをリサイクルし、ビューをVISIBLEに戻すと、

+0

私はこのコメントを友人、Androidやプログラミングについて知っている人、そうでない人に渡しました。すべてこれはこのようなことを行う正しい方法であれば、それはAndroidのためによく見えないと私の気持ちを分かち合いました。これはAndroidでこれを行う正しい方法ですか?それとも、これを行うにはちょうどハックですか?私はこれが解決策に関する十分に文書化された問題ではないことに驚いています。 –

+0

Androidの多くのものはハッキングのように感じます。私はそれがどちらの場合にあなたのために最善である煮沸することができると思う。行が変わらないことが確実であれば、これは良いアプローチのようです。それ以外の場合は、setPadding()を使用します。 –

1
関連する問題