Add fragment transition animations to the Settings UI screen

This commit is contained in:
sigmabeta 2016-01-23 17:00:06 -05:00
parent 6e13496d8d
commit 04974835d6
10 changed files with 224 additions and 7 deletions

View File

@ -1,10 +1,10 @@
package org.dolphinemu.dolphinemu.ui.settings;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
@ -45,16 +45,30 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
mPresenter.onStop(isFinishing());
}
@Override
public void onBackPressed()
{
mPresenter.onBackPressed();
}
@Override
public void showSettingsFragment(String menuTag, boolean addToStack)
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_content, SettingsFragment.newInstance(menuTag), SettingsFragment.FRAGMENT_TAG);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
if (addToStack)
{
transaction.setCustomAnimations(
R.animator.settings_enter,
R.animator.settings_exit,
R.animator.settings_pop_enter,
R.animator.setttings_pop_exit);
transaction.addToBackStack(null);
mPresenter.addToStack();
}
transaction.replace(R.id.frame_content, SettingsFragment.newInstance(menuTag), SettingsFragment.FRAGMENT_TAG);
transaction.commit();
}
@ -88,9 +102,15 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
@Override
public void popBackStack()
{
getFragmentManager().popBackStackImmediate();
}
private SettingsFragment getFragment()
{
return (SettingsFragment) getSupportFragmentManager().findFragmentByTag(SettingsFragment.FRAGMENT_TAG);
return (SettingsFragment) getFragmentManager().findFragmentByTag(SettingsFragment.FRAGMENT_TAG);
}
public static final String ARGUMENT_FILE_NAME = BuildConfig.APPLICATION_ID + ".file_name";

View File

@ -20,6 +20,8 @@ public final class SettingsActivityPresenter
private String mFileName;
private HashMap<String, SettingSection> mSettingsBySection;
private int mStackCount;
public SettingsActivityPresenter(SettingsActivityView view)
{
mView = view;
@ -94,4 +96,22 @@ public final class SettingsActivityPresenter
});
}
}
public void addToStack()
{
mStackCount++;
}
public void onBackPressed()
{
if (mStackCount > 0)
{
mView.popBackStack();
mStackCount--;
}
else
{
mView.finish();
}
}
}

View File

@ -48,4 +48,14 @@ public interface SettingsActivityView
* @param message The contents of the onscreen message.
*/
void showToastMessage(String message);
/**
* Show the previous fragment.
*/
void popBackStack();
/**
* End the activity.
*/
void finish();
}

View File

@ -1,9 +1,9 @@
package org.dolphinemu.dolphinemu.ui.settings;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;

View File

@ -0,0 +1,56 @@
package org.dolphinemu.dolphinemu.ui.settings;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
/**
* FrameLayout subclass with few Properties added to simplify animations.
*/
public final class SettingsFrameLayout extends FrameLayout
{
private float mVisibleness = 1.0f;
public SettingsFrameLayout(Context context)
{
super(context);
}
public SettingsFrameLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public SettingsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
public SettingsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
{
super(context, attrs, defStyleAttr, defStyleRes);
}
public float getYFraction()
{
return getY() / getHeight();
}
public void setYFraction(float yFraction)
{
final int height = getHeight();
setY((height > 0) ? (yFraction * height) : -9999);
}
public float getVisibleness()
{
return mVisibleness;
}
public void setVisibleness(float visibleness)
{
setScaleX(visibleness);
setScaleY(visibleness);
setAlpha(visibleness);
}
}

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="yFraction"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="1.0"
android:valueTo="0"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="translationZ"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="100.0"
android:valueTo="0"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="elevation"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="100.0"
android:valueTo="0"/>
</set>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/accelerate_cubic"
android:propertyName="visibleness"
android:valueFrom="1.0f"
android:valueTo="0.6f"
android:valueType="floatType"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="translationZ"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="0"
android:valueTo="-100.0"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="elevation"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="0"
android:valueTo="-100.0"/>
</set>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="visibleness"
android:valueFrom="0.6f"
android:valueTo="1.0f"
android:valueType="floatType"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="translationZ"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="-100.0"
android:valueTo="0"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="elevation"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="-100.0"
android:valueTo="0"/>
</set>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/accelerate_cubic"
android:propertyName="yFraction"
android:valueFrom="0"
android:valueTo="1.0"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="translationZ"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="0.0"
android:valueTo="100"/>
<objectAnimator
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_cubic"
android:propertyName="elevation"
android:startOffset="@android:integer/config_shortAnimTime"
android:valueFrom="0.0"
android:valueTo="100"/>
</set>

View File

@ -1,11 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<org.dolphinemu.dolphinemu.ui.settings.SettingsFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/list_settings"
android:background="@android:color/white"
android:elevation="@dimen/elevation_high"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
</org.dolphinemu.dolphinemu.ui.settings.SettingsFrameLayout>