2

画面の上から下に移動するアクティビティのビューの遷移アニメーションを実行しています。画面のタイトルビューの上に来ています。ビュー内のみ(子のみに関連)または特定のYまたはX位置からアニメーションを適用するにはどうすればよいですか?

以下のコードを使用しています

XML コード

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromYDelta="-100%p" android:toYDelta="0" android:duration="500" />
</set>

Java コード

Animation in = AnimationUtils.loadAnimation(_activity, R.anim.in_from_top);
view.setAnimation(in);

現在、このビューは画面の上部から来ています。画面の上部ではなく、特定の X、Y ポイントからアニメーションを開始したい。私の要件によると、アニメーション ビューがアクティビティのタイトルの上に表示されます。これは欠陥です。

4

3 に答える 3

1

2人の子を1人の親に追加した場合、この問題が発生します。子を別のレイアウトに追加してから、このレイアウトを実際のレイアウトに追加します。これで問題が解決します。

于 2012-10-09T17:13:53.310 に答える
0

Javaコードからのみアニメーションを試すことができます

Animation animation1=new TranslateAnimation(0.0f, 0.0f, 10.0f, 250.0f);
animation1.setDuration(5000);
view.startAnimation(animation1);

TranslateAnimation(fromX, toX, fromY, toY)上記のコードで行ったように、X 座標と Y 座標を設定できます。

于 2012-10-10T20:30:47.313 に答える
0

次のようなカスタム アニメーション クラスを作成する必要があります。

public class ExpandAnimation extends Animation {
private View mAnimatedView;
private LayoutParams mViewLayoutParams;
private int mMarginStart, mMarginEnd;
private boolean mIsVisibleAfter = false;
private boolean mWasEndedAlready = false;

/**
 * Initialize the animation
 * 
 * @param view
 *            The layout we want to animate
 * 
 * @param duration
 *            The duration of the animation, in ms
 */
public ExpandAnimation(View view, int duration) {
    setDuration(duration);
    mAnimatedView = view;
    mViewLayoutParams = (LayoutParams) view.getLayoutParams();
    mIsVisibleAfter = (mViewLayoutParams.bottomMargin == 0);
    mMarginStart = mViewLayoutParams.bottomMargin;
    mMarginEnd = (mMarginStart == 0 ? (0 - view.getHeight()) : 0);
    view.setVisibility(View.VISIBLE);
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    super.applyTransformation(interpolatedTime, t);

    if (interpolatedTime < 0.5f) {
        mViewLayoutParams.bottomMargin = mMarginStart + (int) ((mMarginEnd - mMarginStart) * interpolatedTime);
        mAnimatedView.requestLayout();
    } else if (!mWasEndedAlready) {
        mViewLayoutParams.bottomMargin = mMarginEnd;
        mAnimatedView.requestLayout();

        if (mIsVisibleAfter) {
            mAnimatedView.setVisibility(View.GONE);
        }
        mWasEndedAlready = true;
    }
}

}

そして、このアニメーションを必要な x、y 座標に適用します。

ある x,y 座標にボタンがあり、そのクリックでビューをアニメーション化してからスクロールバックするとします。次のようなことをしなければなりません:

 private View previous = null;
 private void doTransformation() {
    if (previous != null) {
        ((LinearLayout.LayoutParams) previous.getLayoutParams()).bottomMargin = -200;
        ExpandAnimation anim = new ExpandAnimation(previous, 300);
        previous.startAnimation(anim);
        previous = null;
    } else {
        View yourlayout= findViewById(R.id.your_layout);
        ExpandAnimation anim = new ExpandAnimation(yourLayout, 300);
        detailLayout.startAnimation(anim);
        previous = yourLayout;
    }
}
于 2012-10-08T07:48:20.603 に答える