Да, это возможно. После захвата события «Назад» или любого другого события, которое вызывает загрузку нового экрана, вы можете управлять направлением скольжения экрана, но интуитивно не понятно, как это сделать. Самый внешний слой макета никогда не будет анимирован вашим кодом, поэтому вам может понадобиться поместить макет в оболочку. Вам также придется вызывать код анимации изнутри onCreate () экрана, где вы хотите, чтобы анимация происходила.
Если вы создаете проект с именем «ScreenTransitionLab», используя «android.example» в качестве пакета, вы можете использовать следующее, чтобы получить рабочий пример, который поможет вам понять, как выполнить то, что вы хотите сделать. В настоящее время он настроен на верхний и нижний переходы, но его можно легко изменить, чтобы использовать левый и правый переходы.
Главный экран, который был изменен так, что весь экран будет скользить:
<?xml version="1.0" encoding="utf-8"?>
<!--
Wrapper layout whose children are to be animated. The outermost layout
used by an activity can never be animated, so this wrapper is needed.
The wrapper layout is given a different color so it can be
distinguished from the layout that is animated.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#0000FF"
>
<!-- Actual layout that is animated. -->
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF0000"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/btnForwards"
android:text="Forwards" />
</LinearLayout>
</LinearLayout>
Новый экран, который был изменен так, что весь экран будет скользить:
<?xml version="1.0" encoding="utf-8"?>
<!--
Wrapper layout whose children are to be animated. The outermost layout
used by an activity can never be animated, so this wrapper is needed.
The wrapper layout is given a different color so it can be
distinguished from the layout that is animated.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#0000FF"
>
<!-- Actual layout that is animated. -->
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF0000"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/btnForwards"
android:text="Forwards" />
</LinearLayout>
</LinearLayout>
Действие ScreenTransitionsLab, которое анимируется при нажатии кнопки «Назад» в действии NewScreen:
package android.example;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class ScreenTransitionLab extends Activity {
// Layout fields
protected LinearLayout mainLayout;
public static Button btnForwards = null;
public static Activity currentActivity;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
currentActivity = this;
/*
* This creates View objects from the xml file. The xml file should
* define all views and all static attributes.
*/
mainLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.main,
null);
btnForwards = (Button) mainLayout.findViewById(R.id.btnForwards);
btnForwards.setOnClickListener(forwardsOnClickListener);
UIHelper.setSlideDirection(mainLayout, UIHelper.bottom);
/*
* Use the Layout that contains the View objects that were modified to
* create screen that will be shown after activity is done processing
* instead of the xml file. The Layout will contain all of the views and
* static attributes that were defined in the xml file plus all of the
* dynamic attributes that were defined in the code above.
*/
setContentView(mainLayout);
}
public View.OnClickListener forwardsOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
Activity currentActivity = (Activity) v.getContext();
Intent i = new Intent(currentActivity, NewScreen.class);
currentActivity.startActivity(i);
/*
* Remove activity that is no longer current from the activity stack
* to prevent the application from bloating.
*/
currentActivity.finish();
}
};
}
Операция NewScreen, которая анимируется при нажатии кнопки «Вперед» в действии ScreenTransitionsLab:
package android.example;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class NewScreen extends Activity {
protected LinearLayout mainLayout;
public static Button btnBackwards = null;
public static Activity currentActivity;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
currentActivity = this;
/*
* This creates View objects from the xml file. The xml file should
* define all views and all static attributes.
*/
mainLayout = (LinearLayout) getLayoutInflater().inflate(
R.layout.new_screen, null);
btnBackwards = (Button) mainLayout.findViewById(R.id.btnBackwards);
btnBackwards.setOnClickListener(backwardsOnClickListener);
UIHelper.setSlideDirection(mainLayout, UIHelper.top);
/*
* Use the Layout that contains the View objects that were modified to
* create screen that will be shown after activity is done processing
* instead of the xml file. The Layout will contain all of the views and
* static attributes that were defined in the xml file plus all of the
* dynamic attributes that were defined in the code above.
*/
setContentView(mainLayout);
}
public View.OnClickListener backwardsOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
Activity currentActivity = (Activity) v.getContext();
Intent i = new Intent(currentActivity, ScreenTransitionLab.class);
currentActivity.startActivity(i);
/*
* Remove activity that is no longer current from the activity stack
* to prevent the application from bloating.
*/
currentActivity.finish();
}
};
}
Класс UIHelper, который фактически выполняет анимацию:
package android.example;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LayoutAnimationController;
import android.view.animation.TranslateAnimation;
public class UIHelper {
public static final int top = 1;
public static final int bottom = 2;
public static final int left = 3;
public static final int right = 4;
/**
* Set direction that children in the panel will slide in from when next
* displayed.
*
* @param panel
* {@link ViewGroup} whose children will be slid in from the
* specified direction when the panel is next displayed.
* @param fromDirection
* Primitive int indicating the direction to slide the children
* of the panel from.
*/
public static void setSlideDirection(ViewGroup panel, int fromDirection) {
float fromX = 0;
float toX = 0;
float fromY = 0;
float toY = 0;
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(100);
set.addAnimation(animation);
switch (fromDirection) {
case top:
fromX = 0.00f;
toX = 0.00f;
fromY = -1.00f;
toY = 0.00f;
break;
case bottom:
fromX = 0.00f;
toX = 0.00f;
fromY = 1.00f;
toY = 0.00f;
break;
case left:
fromX = -1.00f;
toX = 0.00f;
fromY = 0.00f;
toY = 0.00f;
break;
default:
fromX = 1.00f;
toX = 0.00f;
fromY = 0.00f;
toY = 0.00f;
break;
}
animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, fromX,
Animation.RELATIVE_TO_SELF, toX, Animation.RELATIVE_TO_SELF,
fromY, Animation.RELATIVE_TO_SELF, toY);
animation.setDuration(200);
set.addAnimation(animation);
LayoutAnimationController controller = new LayoutAnimationController(
set, 0.25f);
panel.setLayoutAnimation(controller);
}
}