22

在我的 Android 应用程序中,我有一个浮动的Activity. 它从我的应用程序外部开始,ActivityOptions.makeScaleUpAnimation用于从“原始”矩形放大。当我Activity完成时,我希望它与那个动画相反:即它在淡出时收缩回那个矩形。

我知道我可以用 得到矩形getIntent().getSourceBounds(),我希望能够overridePendingTransition()在完成时使用来实现这个效果,但overridePendingTransition()只能接受一个固定的 XML 资源:似乎没有办法让那个动画依赖于源界限。还有什么我可以用来达到这个效果的吗?

我的应用程序适用于 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:

       <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
  }

此外,覆盖完成方法是这样的:

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 回答