направление переключения активности Android - PullRequest
3 голосов
/ 24 февраля 2011

при переключении между двумя действиями экран перемещается между справа налево. Когда я нажимаю клавишу возврата, экран скользит справа налево. Это способ, которым, когда я нажимаю клавишу возврата из действия, чтобы изменить направление скольжения экрана?

Ответы [ 2 ]

5 голосов
/ 28 марта 2011

Да, это возможно. После захвата события «Назад» или любого другого события, которое вызывает загрузку нового экрана, вы можете управлять направлением скольжения экрана, но интуитивно не понятно, как это сделать. Самый внешний слой макета никогда не будет анимирован вашим кодом, поэтому вам может понадобиться поместить макет в оболочку. Вам также придется вызывать код анимации изнутри 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);

    }

}
3 голосов
/ 17 марта 2012

Решение Дэнни можно заставить работать, но оно слишком сложное. Ключевой метод, о котором вы хотите узнать, это overridePendingTransition ().

Вот основной вид деятельности, который я смоделировал, чтобы использовать его. Я сделал переход по вертикали, чтобы показать, что вы можете выполнять преобразования в любом направлении:

package com.superliminal.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ScreenTransitionTest extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btnForwards = (Button) findViewById(R.id.btnForwards);
        btnForwards.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Activity currentActivity = (Activity) v.getContext();
                Intent i = new Intent(currentActivity, NewScreen.class);
                // Tell the new activity how return when finished.
                i.putExtra("anim id in", R.anim.down_in);
                i.putExtra("anim id out", R.anim.down_out);
                currentActivity.startActivity(i);
                // This makes the new screen slide up as it fades in
                // while the current screen slides up as it fades out.
                overridePendingTransition(R.anim.up_in, R.anim.up_out);
            }
        });
    }
}

Вот реализация нового экрана:

package com.superliminal.test;

import android.app.Activity;
import android.os.Bundle;

public class NewScreen extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_screen);
    }

    @Override
    public void onBackPressed() {
        this.finish();
        // Use exiting animations specified by the parent activity if given
        // Translate left if not specified.
        overridePendingTransition(
            getIntent().getIntExtra("anim id in", R.anim.left_in),
            getIntent().getIntExtra("anim id out", R.anim.left_out));
    }
}

Ваши файлы макетов могут быть любыми. Вам не нужен слой обертки. Вот мой main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#990000" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Main Activity" />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnForwards"
        android:text="Forward" />
</LinearLayout>

А вот мой new_screen.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#009900" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="New Screen. Use back button to return." />
</RelativeLayout>

Единственное, что вам нужно, это анимационные XML-файлы, которые вы помещаете в папку res / anim.

up_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="-100%p" android:toYDelta="0" android:duration="1000"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" />
</set>

up_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="0" android:toYDelta="100%p" android:duration="1000"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000" />
</set>

down_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="1000"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" />
</set>

down_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="0" android:toYDelta="-100%p" android:duration="1000"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000" />
</set>
...