1

onDraw を実装するカスタム ビューがあり、背景と右上の小さなオーバーレイ イメージを正常に描画します。そのオーバーレイ画像 (ScaleAnimation と Rotate Animation を含む AnimationSet) を手動でアニメーション化するには、次のようにします。

final AnimationSet animationSet = new AnimationSet(false);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(rotationAnimation);
animationSet.setFillAfter(true);
post(new Runnable() {
    @Override
    public void run () {
        animationSet.start();
        new Handler().post(getAnimationRunnable(animationSet));
    }

    private Runnable getAnimationRunnable (final AnimationSet animationSet) {
        return new Runnable() {
            @Override
            public void run () {
                final Transformation outTransformation = new Transformation();
                if (animationSet.getTransformation(System.currentTimeMillis(), outTransformation)) {
                    // store matrix for applying in onDraw
                    mMatrix = outTransformation.getMatrix();
                    // THIS INVALIDATE DOESN'T WORK
                    parent.invalidate(new Rect(getParentInvalidateRect()));
                    post(getAnimationRunnable(animationSet));
                }
            }
        };
    }
});

このようにカスタムビューを無効にすると...

                    // THIS INVALIDATE DOES WORK
                    invalidate(getOverlayClientRect());

その後、アニメーションが発生し、アニメーション画像がクリップされることを除いて、すべてが素晴らしいです-上と右の境界を超えて拡大されているためです。

しかし、カスタム ビューの右上隅の領域と交差する parent.invalidate() に Rect を渡すと、カスタム ビューの onDraw がトリガーされません。

そう ...

  • このアプローチは機能しますか?
  • もしそうなら、それがカスタム Views onDraw メソッドを呼び出すかどうかを決定する、parent.invalidate() に渡された Rect 以外の要因はありますか?
4

1 に答える 1

1

何度も検索した結果、答えは明らかでした。親の clipChildren プロパティを false に設定する必要がありました。カスタムビューだけで、親を無効にする必要はありませんでした。

4.0.3 タブレットでは問題なく動作しました。ただし、Galaxy Nexus (4.2.2) では、アニメーション中に境界外にレンダリングされただけでなく、渡された Rect の背景が実際にクリアされて無効化されただけでした。そのため、アニメーションが完了したとき、画像の残りの部分がまだ Rect の外側に表示されていました。そこでの解決策は、アニメーション中に描画された最大のビットマップをカバーするのに十分な大きさの Rect を渡すことでした。

于 2013-07-18T16:39:29.093 に答える