1

私はかなり複雑なレイアウトを持っています。相対レイアウトをルートとして使用し、その中にいくつかのテーブル ビューとさらにいくつかのネストがあります。これらのレイアウト間でイメージ ビューをアニメーション化すると、イメージ クリップが作成されます。親レイアウトに背景があり、アニメーションはその下にあるように見えます。すべてのレイアウトで android:clipChildren="false" と android:clipToPadding="false" を設定しました。また、anim.setZAdjustment(Animation.ZORDER_TOP); も設定しました。私のすべてのアニメーションで。私は何を間違っていますか?

編集: これまでに少なくとも 2 つのバグを発見しました。android:background= に 16 進数の色を指定すると、アニメーションに重大な問題が発生します。テーブル レイアウトにも、クリッピングを引き起こす regoin があるようです。フレームレイアウトでも同じことが見られます。実際に自分のものが思い通りに機能するようになったら、回答を追加します。線形レイアウトのみを使用することが解決策だと感じています。

問題を生成するサンプル コードを次に示します。2 つの子の相対レイアウトを削除すると、アニメーションは期待どおりに完了します。


ジャワ:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ImageView imageViewtop = (ImageView) findViewById(R.id.ImageView01);
    imageViewtop.setOnClickListener(btnCardListener);
}

private OnClickListener btnCardListener = new OnClickListener() {
    public void onClick(View v) {

        ImageView ImageView03 = (ImageView) findViewById(R.id.ImageView03);
        ImageView ImageView05 = (ImageView) findViewById(R.id.ImageView05);

        int[] playLoc = { 0, 0 };
        int[] botLoc = { 0, 0 };
        ImageView05.getLocationOnScreen(playLoc);
        ImageView03.getLocationOnScreen(botLoc);
        int xMove = playLoc[0] - botLoc[0];
        int yMove = playLoc[1] - botLoc[1];

        AnimationSet animSet = new AnimationSet(true);

        RotateAnimation ranim = new RotateAnimation(0f, 180f,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f); // , 200, 200); //
                                                    // canvas.getWidth()
        // 2, canvas.getHeight() / 2);
        ranim.setDuration(400);
        ranim.setInterpolator(new DecelerateInterpolator());

        TranslateAnimation transAnim = new TranslateAnimation(
                Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, xMove, // +80.0f,
                Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, yMove // -100.0f
        );
        transAnim.setInterpolator(new DecelerateInterpolator()); // AccelerateInterpolator
                                                                    // ,
                                                                    // LinearInterpolator
        transAnim.setZAdjustment(Animation.ZORDER_TOP);
        transAnim.setAnimationListener(new AnimationListener() {
            public void onAnimationStart(Animation animation) {
            }

            public void onAnimationEnd(Animation animation) {
                ImageView ImageView03 = (ImageView) findViewById(R.id.ImageView03);
                ImageView ImageView05 = (ImageView) findViewById(R.id.ImageView05);

                ImageView05.setVisibility(View.VISIBLE);
                ImageView03.setVisibility(View.INVISIBLE);
            }

            public void onAnimationRepeat(Animation animation) {
            }
        });
        transAnim.setDuration(1000);

        // Order matters...
        animSet.addAnimation(ranim);
        animSet.addAnimation(transAnim);

        ImageView03.startAnimation(animSet);
    }
};

XML:

<RelativeLayout android:id="@+id/relativeParentLayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:clipToPadding="false">
    <RelativeLayout android:id="@+id/relativeParentLayout1"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="150dip" android:background="#440000"
        android:layout_alignParentTop="true" android:clipChildren="false"
        android:clipToPadding="false">
        <ImageView android:layout_height="wrap_content" android:id="@+id/ImageView01"
            android:layout_width="wrap_content" android:src="@drawable/card_back"
            android:layout_weight="0" android:layout_alignParentTop="true" />


        <ImageView android:layout_height="wrap_content" android:id="@+id/ImageView03"
            android:layout_width="wrap_content" android:src="@drawable/card_back"
            android:layout_weight="0" android:layout_gravity="center_vertical"
            android:layout_alignParentRight="true" />
    </RelativeLayout>
    <RelativeLayout android:id="@+id/relativeParentLayout2"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="150dip" android:background="#000044"
        android:layout_alignParentBottom="true" android:clipChildren="false"
        android:clipToPadding="false">

        <ImageView android:layout_height="wrap_content"
            android:layout_below="@+id/LinearLayout01" android:id="@+id/ImageView05"
            android:layout_width="wrap_content" android:src="@drawable/card_back"
            android:layout_weight="0" android:layout_alignParentBottom="true" />
    </RelativeLayout>
</RelativeLayout>
4

3 に答える 3

1

秘訣は、ビューを囲むレイアウトに setClipChildren を設定することでした。

于 2014-03-14T22:34:23.267 に答える
1

私は同じ問題を抱えていましたが、数日後に解決策を見つけました...ありがとう:

http://www.mail-archive.com/android-developers@googlegroups.com/msg67535.html

この問題の解決策を見つけました。ビューを表示すると、すべてが正常に機能したという事実からヒントが得られました。どうやら、アニメーションが実行されているとき、ショーによって強制される更新はバックグラウンドで行われ、ちらつきは発生しません。ビューを非表示にしているときに onAnimationEnd() のバックエンドに短いアニメーションを追加すると、ちらつきがなくなります。

作業コードの新しい onAndimationEnd() は次のとおりです

    public void onAnimationEnd(Animation animation) {
             animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f);
                    animation.setDuration(1);
                    mPlayer0Panel.startAnimation(animation);
    }
于 2012-04-22T14:36:35.160 に答える
0

もっと良い答えがあればいいのにと思いますが、アニメーション化したいオブジェクトを最上位ビューに追加し、そこでアニメーションを実行してから非表示にすることで問題を解決しました。あまり満足のいくものではありません。より良い方法を見つけましたか?

于 2010-11-12T15:51:07.610 に答える