In my Android app, I have a floating Activity. It's started from outside my app using ActivityOptions.makeScaleUpAnimation to scale up from an "originating" rectangle. When my Activity finishes, I'd like it to do the reverse of that animation: i.e. it shrinks back to that rectangle as it fades out.
I know I can get the rectangle with getIntent().getSourceBounds(), and I'd hoped to be able to use overridePendingTransition() when finishing to achieve this effect, but overridePendingTransition() can only accept a fixed XML resource: there doesn't seem to be a way to make that animation depend on the source bounds. Is there something else I can use to achieve this effect?
My app is for API 11+, but as it's a cosmetic effect only, I'd be satisfied with a solution that depends on a later version.
2 Answers
Answers 1
I don think there is a way to scale down the activity window other than the overridePendingTransition call. However this code may help:
Scale up
ActivityOptions opts = ActivityOptions.makeCustomAnimation(getActivity(), R.anim.scale_up, 0); startActivity(new Intent(this, SecondActivity.class),opts.toBundle());
Here is the scale_up animation file:
<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> Scale down
Call this code from the exiting activity:
finish(); overridePendingTransition(0, R.anim.scale_down); Here is the scale_down animation file:
<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> You can vary the X and Y scale to get the desired rectangle. Hope this helps.
Answers 2
Based on my last comment, here is the solution which i have tried and it works. You may have to modify to suit your requirements.
Implement a Activity with Transparent background and with no title inside the manifest:
<activity android:name="com.example.backgroundsensor.AnimatedActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="Animated activity" /> and let it set the content view with a layout as :
<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> The visibleAreaView is the one you will see on the screen, since activity is transparent. You can set the bounds of the view in OnCreate of the activity().
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.animated_activity); // set the bounds of the animateView } Also, Override the finish method something like this:
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); }
0 comments:
Post a Comment