2

API11より前のプロジェクトにこれが必要です。

右からビューを追加する方法を探しています。これにより、現在の全画面ビューが左に移動し、新しいビューが画面に表示されるようになります。

新しいビューは画面幅の約 1/3 であるため、現在のフル スクリーン ビューが画面の外に移動する距離になります。

TranslateAnimation() を使用したさまざまなソリューションにうんざりしていますが、アニメーションには満足していますが、元のビューのすべてのクリック可能な領域が本来あるべき場所にないという問題があります。

そのため、負のマージンでレイアウトを正しく配置するためにレイアウトをいじり始めましたが、数秒後に新しいレイアウト要求が来ると、ビューが元の位置にポップされます。また、このソリューションは、アニメーション終了リスナーでビューを移動するときに途切れ途切れの効果がありました。

新しいビューが出入りするときに優れたアニメーションを持ち、レイアウトに関して正しい場所にビューを配置する最も単純なソリューションは何でしょうか。

4

2 に答える 2

11

API11 を使用しているため、Animator APIを使用します。すべてのビューには、対応するセッターとゲッターを持つプロパティがあります。ビューを範囲外に左に移動するには、画面の幅を取得してから次のようにします。

View viewToShiftOut = getOutView();
ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen);
outAnim.setDuration(1000);
outAnim.start();

これにより、ビューとその内容が 1 秒間 (1000 ミリ秒) の間完全に画面の外に移動します。1 つをその場所に移動するには、次のようにします。

View viewToShiftIn = getInView();
ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftIn, "x", widthOfScreen, 0);
inAnim.setDuration(1000);
inAnim.start();

すべてのプロパティ、クリック可能な領域などがビューに追従するため、アニメーションが終了したら完了です。次のように一緒にアニメーション化できます。

View viewToShiftOut = getOutView();
View viewToShiftIn = getInView();
ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen);
ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", widthOfScreen, 0);
outAnim.setDuration(1000);
inAnim.setDuration(1000);
outAnim.start();
inAnim.start();

ブログ投稿

編集: ビューを 1/3 だけシフトしたいことに気付いたので、それぞれをシフトするピクセルの量を得ることができますwidthOfScreen/3

編集 2: もう 1 つの利点は、ほとんどの 3.0 以降のタブレットで発生する問題なく、ハードウェア アクセラレーションを使用できることです。

于 2012-04-17T19:02:42.193 に答える
0

おそらく行っているようにfillAfterとfillEnabledを使用する代わりに、AnimationListenerのonAnimationEndでレイアウトをプログラムで変更して、目的の最終的な位置に合わせる必要があります。

ちらつきを取り除くには、アニメーション化しているビューの onAnimationEnd でも clearAnimation() を呼び出します。

于 2012-04-17T18:28:55.517 に答える