6

FrameLayout 内にいくつかのビューがあります。各ビューにカスタム アニメーション クラスが適用されている、私が書いたトランジションがあります。この移行中に、Z オーダーの下部にあるビューを前面に移動する必要があります。私はこれを行います:

    public static void putBackAtFront(ViewGroup v) 
    {
        v.getChildAt(0).bringToFront();
        refreshEverything(v);
    }

これは、カスタム アニメーションの applyTransformation() 内から呼び出されます。

すなわち

public class PivotAnimation extends Animation {
    private View view;
    ...
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) 
    {
        ...
        if(interpolatedTime >= 1.f && isAtBack(view))
        {
           putBackAtFront(view);
        }
        ...
    }
    ...
}

refreshEverything() は、親の FrameLayout とそのすべての子に対して、invalidate() と requestLayout() を呼び出します。

putBackAtFront() が呼び出されると、現在下部にある View が 1 フレームだけ消えてからすぐに再表示され、ちらつきが目立つことを除いて、すべてが完全に機能します。refreshEverything() を呼び出さずに試してみましたが、違いはありません。

API レベル 7 をターゲットにしています。

4

2 に答える 2

1

applyTransformation() はアニメーション中に複数回呼び出されるため、interpolatedTime に基づいてアニメーションを実行する必要があります.1.0 の場合、アニメーションは最後にあるため、ここで前面に移動する必要があります。

したがって、私の意見では、メソッドへのこれらの呼び出しのいくつかで、 getChildAt(0) が必要なビューとは異なるビューを取得し、ちらつきが表示されると、このちらつきが発生します。

于 2012-04-02T14:19:00.707 に答える
0

私はそれが3つのことのいずれかでなければならないと考えています:

3.0 以降の API を使用してビルドしている場合は、ハードウェア アクセラレーションが有効になっている可能性があります。これは、4.0 でもデフォルトでオンになっています。使用してみることができます

    setLayerType(LAYER_TYPE_SOFTWARE, null);

そのレイアウト/ビュー/ウィンドウでハードウェア アクセラレーションを無効にします。

また、すべてのビューが相対レイアウトの子である場合は、requestLayout()を呼び出す必要がない場合があります。z-index の変更は関係ありません。

invalidate を呼び出す必要はほとんどないかもしれません。Views をフォーカス可能にして、bringToFront() の代わりに requestFocus() を呼び出してましか? BringToFront()は明らかにビューをその親から削除し、再度追加します。これが起こっている間、何かが描画を一時停止しているとは思わないので、これはステップ間で簡単に無効化を引き起こす可能性があります。

于 2012-04-05T17:55:29.797 に答える