5

ListView詳しくは説明しませんが、GMail の「スライドからアーカイブ」機能と同様に、要素を「スライド」できるようにしたいと考えています。私は onTouchListener で問題ありませんが、私の質問はスライド アニメーションに関するものです。

真っ先に思い浮かぶのはこの2点..

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

と..

view.setX(slideOffset);

前者は、エミュレーター上でさえ、非常にバターです。
後者は、私の Galaxy Nexus では少しジャンキーです。

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

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

ここに画像の説明を入力

4

3 に答える 3

1

親に影響を与えるため、 setX() の方が遅いと確信しています。ビューの X を変更すると、値を更新するたびに親の onLayout/onMeasure が呼び出されます。これは、子の X 値によって親の他のアイテムが移動する可能性があるためです。そのため、親はそれ自体を再描画する必要があります。

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

アイテムをアニメーション化しようとしていますか? それとも、Gmail のようにユーザーに移動してもらいたいですか? ObjectAnimator を使用して、アイテムの「X」値を処理できます。アイテムの「ハードウェア レイヤー」と組み合わせることで、よりスムーズなエクスペリエンスが実現します。その方法の詳細については、http: //developer.android.com/guide/topics/graphics/hardware-accel.htmlを参照してください。

于 2013-02-06T01:37:55.217 に答える
1

ええ、より高度な API をターゲットにしている場合、ViewPropertyAnimator はおそらく優れたソリューションです。下位の API をサポートする必要がある場合、実装に関する私の思考プロセスは次のようになります (個人的に実装したことはありませんが、これはパフォーマンスに適しているはずです)。

  1. タッチ ハンドラーで、ユーザーが「スライド」していると判断したら、ビューの可視性を INVISIBLE に設定し、描画キャッシュを別のビットマップに保存します (Bitmap bmp = myView.getDrawingCache();)。

  2. そのビットマップをビューと同じ場所に描画し、キャンバスの変換メソッドを使用して、ユーザーのタッチ ポイントの x 位置に従って位置をシフトします。

  3. ユーザーが手放した後、(できればアニメーションでスムーズに) 元に戻し、ビットマップをリサイクルし、ビューを VISIBLE に戻します。

于 2013-02-06T01:43:33.617 に答える