22

私のAndroidアプリには、フローティングがありActivityます。ActivityOptions.makeScaleUpAnimation「元の」長方形から拡大するために、アプリの外部から開始されます。終了したら、Activityそのアニメーションの逆を行いたいと思います。つまり、フェードアウトすると、その長方形に縮小します。

で四角形を取得できることはわかっており、この効果を達成するために終了時getIntent().getSourceBounds()に使用できることを望んでいましたが、固定の XML リソースしか受け入れることができません。アニメーションを依存させる方法はないようです。ソース境界。この効果を達成するために使用できるものは他にありますか?overridePendingTransition()overridePendingTransition()

私のアプリは API 11+ 用ですが、これは見た目だけの効果なので、新しいバージョンに依存するソリューションで十分です。

4

2 に答える 2

8

overridePendingTransition 呼び出し以外に、アクティビティ ウィンドウを縮小する方法はないと思います。ただし、次のコードが役立つ場合があります。

拡大する

ActivityOptions opts = ActivityOptions.makeCustomAnimation(getActivity(), R.anim.scale_up, 0); startActivity(new Intent(this, SecondActivity.class),opts.toBundle());

scale_up アニメーション ファイルは次のとおりです。

<set  xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
    android:fromXScale="0"
    android:toXScale="1.0"
    android:fromYScale="0"
    android:toYScale="1.0"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:duration="500"/>
</set>

スケールダウン

終了するアクティビティから次のコードを呼び出します。

finish();

overridePendingTransition(0, R.anim.scale_down);

scale_down アニメーション ファイルは次のとおりです。

<set xmlns:android="http://schemas.android.com/apk/res/android">
   <scale
    android:fromXScale="1.0"
    android:toXScale="0"
    android:fromYScale="1.0"
    android:toYScale="0"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:duration="250"/>
</set>

X と Y のスケールを変更して、目的の長方形を得ることができます。お役に立てれば。

于 2014-10-06T20:40:15.093 に答える
3

私の最後のコメントに基づいて、これが私が試した解決策であり、うまくいきます。要件に合わせて変更する必要がある場合があります。

背景が透明でマニフェスト内にタイトルのないアクティビティを実装します。

       <activity
        android:name="com.example.backgroundsensor.AnimatedActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:label="Animated activity" /> 

レイアウトを使用してコンテンツビューを次のように設定します。

  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:color/transparent"
   tools:ignore="MergeRootFrame" >

    <View
         android:id="@+id/visibleAreaView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center"
        android:background="@android:color/holo_green_dark" />

 </FrameLayout>

アクティビティは透過的であるため、visibleAreaView が画面に表示されます。activity() の OnCreate でビューの境界を設定できます。

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.animated_activity);

      // set the bounds of the animateView
  }

また、finish メソッドを次のようにオーバーライドします。

boolean animateFirst=true;
@Override
public void finish() {
     if(animateFirst)
     {
         animateFirst = false;
         loadAnim();

     }else
     {
         super.finish();
     }
}

 public void loadAnim() {

    View v = findViewById(R.id.animateView);
    float x= v.getX() + v.getRight()/2;
    float y = v.getY();
    anim = new ScaleAnimation(1.0f, 0.0f,1.0f, 0.0f, x, y);
    anim.setDuration(300);
    anim.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            findViewById(R.id.animateView).setVisibility(View.GONE);
            AnimatedActivity.this.finish();
        }
    });
    v.startAnimation(anim);

}
于 2014-10-07T05:13:52.623 に答える