Android: Show transition animation while game loads.

This commit is contained in:
sigmabeta 2015-06-26 08:32:51 -04:00
parent 0679e43efe
commit 0fcf0e1d21
6 changed files with 91 additions and 12 deletions

View File

@ -12,9 +12,11 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.NativeLibrary;
@ -51,6 +53,10 @@ public final class EmulationActivity extends AppCompatActivity
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// Picasso will take a while to load these big-ass screenshots. So don't run
// the animation until we say so.
postponeEnterTransition();
mDeviceHasTouchScreen = getPackageManager().hasSystemFeature("android.hardware.touchscreen"); mDeviceHasTouchScreen = getPackageManager().hasSystemFeature("android.hardware.touchscreen");
// Get a handle to the Window containing the UI. // Get a handle to the Window containing the UI.
@ -95,21 +101,42 @@ public final class EmulationActivity extends AppCompatActivity
Picasso.with(this) Picasso.with(this)
.load(screenPath) .load(screenPath)
.fit()
.noFade() .noFade()
.into(mImageView); .noPlaceholder()
.into(mImageView, new Callback()
{
@Override
public void onSuccess()
{
scheduleStartPostponedTransition(mImageView);
}
@Override
public void onError()
{
// Still have to do this, or else the app will crash.
scheduleStartPostponedTransition(mImageView);
}
});
mImageView.animate() mImageView.animate()
.setStartDelay(2000) .setStartDelay(2000)
.setDuration(500) .setDuration(500)
.alpha(0.0f) .alpha(0.0f)
.withStartAction(new Runnable()
{
@Override
public void run()
{
mFrameLayout.setVisibility(View.VISIBLE);
}
})
.withEndAction(new Runnable() .withEndAction(new Runnable()
{ {
@Override @Override
public void run() public void run()
{ {
mImageView.setVisibility(View.GONE); mImageView.setVisibility(View.GONE);
mFrameLayout.setVisibility(View.VISIBLE);
} }
}); });
@ -354,4 +381,20 @@ public final class EmulationActivity extends AppCompatActivity
hideSystemUiAfterDelay(); hideSystemUiAfterDelay();
} }
private void scheduleStartPostponedTransition(final View sharedElement)
{
sharedElement.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}
} }

View File

@ -1,6 +1,7 @@
package org.dolphinemu.dolphinemu.adapters; package org.dolphinemu.dolphinemu.adapters;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.database.DataSetObserver; import android.database.DataSetObserver;
@ -222,7 +223,12 @@ public final class GameAdapter extends RecyclerView.Adapter<GameViewHolder> impl
intent.putExtra("SelectedTitle", holder.title); intent.putExtra("SelectedTitle", holder.title);
intent.putExtra("ScreenPath", holder.screenshotPath); intent.putExtra("ScreenPath", holder.screenshotPath);
view.getContext().startActivity(intent); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
(Activity) view.getContext(),
holder.imageScreenshot,
"image_game_screenshot");
view.getContext().startActivity(intent, options.toBundle());
} }
/** /**

View File

@ -3,14 +3,16 @@
android:layout_height="match_parent" android:layout_height="match_parent"
> >
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/image_screenshot"/>
<FrameLayout <FrameLayout
android:id="@+id/frame_content" android:id="@+id/frame_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:visibility="gone"/> android:visibility="invisible"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/image_screenshot"
android:transitionName="image_game_screenshot"/>
</FrameLayout> </FrameLayout>

View File

@ -20,7 +20,7 @@
android:id="@+id/image_game_screen" android:id="@+id/image_game_screen"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:transitionName="image_game_screen" android:transitionName="image_game_screenshot"
android:layout_weight="1" android:layout_weight="1"
tools:src="@drawable/placeholder_screenshot" tools:src="@drawable/placeholder_screenshot"
tools:scaleType="centerCrop"/> tools:scaleType="centerCrop"/>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<transitionSet>
<changeImageTransform/>
</transitionSet>

View File

@ -7,6 +7,18 @@
<item name="colorPrimary">@color/dolphin_blue</item> <item name="colorPrimary">@color/dolphin_blue</item>
<!-- darker variant for the status bar and contextual app bars --> <!-- darker variant for the status bar and contextual app bars -->
<item name="colorPrimaryDark">@color/dolphin_blue_dark</item> <item name="colorPrimaryDark">@color/dolphin_blue_dark</item>
<!--enable window content transitions
<item name="android:windowContentTransitions">true</item>
&lt;!&ndash; specify enter and exit transitions &ndash;&gt;
<item name="android:windowEnterTransition">@android:transition/fade</item>
<item name="android:windowExitTransition">@android:transition/fade</item>
&lt;!&ndash; specify shared element transitions &ndash;&gt;
<item name="android:windowSharedElementEnterTransition">@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">@transition/change_image_transform</item>
-->
</style> </style>
<!-- Same as above, but use default action bar, and mandate margins. --> <!-- Same as above, but use default action bar, and mandate margins. -->
@ -66,6 +78,19 @@
<item name="colorPrimary">@color/dolphin_blue</item> <item name="colorPrimary">@color/dolphin_blue</item>
<item name="colorPrimaryDark">@color/dolphin_blue_dark</item> <item name="colorPrimaryDark">@color/dolphin_blue_dark</item>
<item name="android:windowTranslucentNavigation">true</item> <item name="android:windowTranslucentNavigation">true</item>
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@android:transition/explode</item>
<item name="android:windowExitTransition">@android:transition/explode</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">@transition/change_image_transform
</item>
<item name="android:windowSharedElementExitTransition">@transition/change_image_transform
</item>
</style> </style>
<!-- Inherit from the Base Dolphin Emulation Theme--> <!-- Inherit from the Base Dolphin Emulation Theme-->
@ -81,7 +106,6 @@
<item name="colorAccent">@color/dolphin_accent_wiiware</item> <item name="colorAccent">@color/dolphin_accent_wiiware</item>
</style> </style>
<!-- Hax to make Tablayout render icons --> <!-- Hax to make Tablayout render icons -->
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab"> <style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item> <item name="textAllCaps">false</item>