web-dev-qa-db-ja.com

Androidの2つのアクティビティ間にスライドアニメーションを適用する方法は?

あるアクティビティから別のアクティビティに移動するときに、左から右へのスライド効果を実現したい。そのために次のコードを使用していますが、結果が得られません。修正してください。

In Java両方のファイル:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);

Res/animディレクトリにある2つのファイル:

fadein.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="5000"
    Android:fromAlpha="0.0"
    Android:interpolator="@Android:anim/slide_out_right"
    Android:toAlpha="1.0" >
</alpha>

fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="5000"
    Android:fromAlpha="0.0"
    Android:interpolator="@Android:anim/slide_in_left"
    Android:toAlpha="1.0" >
</alpha>
50
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

         new Handler().postDelayed(new Runnable() {
             public void run() {

                     /* Create an intent that will start the main activity. */
                     Intent mainIntent = new Intent(SplashScreen.this,
                             ConnectedActivity.class);
                     mainIntent.putExtra("id", "1");

                     //SplashScreen.this.startActivity(mainIntent);
                     startActivity(mainIntent);
                     /* Finish splash activity so user cant go back to it. */
                     SplashScreen.this.finish();

                     /* Apply our splash exit (fade out) and main
                        entry (fade in) animation transitions. */
                     overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
             }
     }, SPLASH_DISPLAY_TIME);   
    }
28
MAC

この2つのファイルをres/animフォルダーに追加します。

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:Android="http://schemas.Android.com/apk/res/Android" 
   Android:duration="@Android:integer/config_longAnimTime" 
   Android:fromXDelta="100%p" 
   Android:toXDelta="0%p"/>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:Android="http://schemas.Android.com/apk/res/Android" 
   Android:duration="@Android:integer/config_longAnimTime" 
   Android:fromXDelta="0%p" 
   Android:toXDelta="-100%p"/>

そして、インテントを通過する次のアクティビティのonCreate()メソッドに次のコードを記述します。

overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
148
Born To Win

enter image description here

デフォルトのアクティビティアニメーションを上書きすると、overridePendingTransitionよりもパフォーマンスが向上します。すべてのAndroidバージョン。

「CustomActivityAnimation」を作成し、これを「windowAnimationStyle」でベーステーマに追加します。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="Android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@Android:style/Animation.Activity">
    <item name="Android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="Android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="Android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="Android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

次に、resフォルダーの下にanimフォルダーを作成し、animフォルダーに次の4つのアニメーションファイルを作成します。

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="100%p" Android:toXDelta="0"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0" Android:toXDelta="-100%p"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="-100%p" Android:toXDelta="0"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0" Android:toXDelta="100%p"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

問題が発生した場合は、私の githubからのサンプルプロジェクト をダウンロードできます。

ありがとう

60

いくつかのメモを付けてアルファアニメーションで上下にスライド

enter image description here

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@integer/activity_transition_time"
    >
    <translate
        Android:fromYDelta="100%p"
        Android:toYDelta="0"/>
    <alpha
        Android:fromAlpha="0.5"
        Android:toAlpha="1"/>
</set>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@integer/activity_transition_time"
    >
    <translate
        Android:fromYDelta="0"
        Android:toYDelta="100%p"/>
    <alpha
        Android:fromAlpha="1"
        Android:toAlpha="0.5"/>
</set>

no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@integer/activity_transition_time"
    Android:fromYDelta="0"
    Android:toYDelta="0"/>

最初のアクティビティ

startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up,  R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate

2番目のアクティビティ

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);

完了

[〜#〜] more [〜#〜]
View Model(このような https://www.youtube.com/watch?v=deZobvh2064 )を提示するときに、iOSアニメーションのようなスライドアニメーションを作成しようとしましたが、失敗しました。

IOSの現在のアニメーションを見ると、下からのアルファ(約50%)のアニメーションは非常に速く、遅くなります。アニメーション時間は約500ミリ秒以上です(アニメーション時間のカウントにはビデオツールを使用します https://www.kapwing.com/trim-video したがって、正確に100%にすることはできません)

次に、Androidに適用しようとします。
アルファを作成するには、<alpha>と成功を使用します。
アニメーションを遅くするよりも速く起動させるには、Android:interpolator="a decelerate interpolator"を使用しますが、ほとんど失敗しました。

Androidには3つのデフォルトdecelerate interpolatorがあります
@Android:interpolator/decelerate_quad-> factor = 1
@Android:interpolator/decelerate_cubic-> factor = 1.5
@Android:interpolator/decelerate_quint _>係数= 2.5
(より高い係数<=>アニメーションは最初からより速く開始し、より遅く終了します)
これは良いチュートリアルです http://cogitolearning.co.uk/2013/10/Android-animations-tutorial-5-more-on-interpolators/ それを理解するために

上記の3つを試してみましたが、iOSのように達成することはできません。iOSのようにアニメーションを速く開始することはできません。次に、ファクター= 3のカスタムdecelerateInterpolatorを作成します

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:factor="3" />

500 -> 750から継続時間を増やします。うまく機能しています(iOSに非常に似ています)。ただし、一部のデバイスでのみ正常に動作し、一部のデバイスではアニメーションが非常に遅くなります。後で、アニメーションがデバイスによって異なる場合があることを知っています(例:一部のデバイスは速くなり、一部のデバイスは遅くなります)。したがって、すべてのAndroidデバイスで同様のアニメーションにすることはできません。 interpolatorを使用しないでください。テストが正確に100%かどうかはわかりませんが、この経験が役立つことを願っています

8
Phan Van Linh

overridePendingTransitionの代わりにstartActivityonCreateを使用できます。少なくとも、それは私のために働く!

完全な例を参照してください here 。 BackPressedでの(逆の)アニメーションが含まれているため、前のアクティビティに戻ります!ただし、特定の例(フェードインおよび-アウト)では、これは不要な場合があります。

1
P Kuijpers

Kotlinの例:

 private val SPLASH_DELAY: Long = 1000
    internal val mRunnable: Runnable = Runnable {
        if (!isFinishing) {
            val intent = Intent(applicationContext, HomeActivity::class.Java)
            startActivity(intent)
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
            finish()
        }
    }


   private fun navigateToHomeScreen() {
        //Initialize the Handler
        mDelayHandler = Handler()

        //Navigate with delay
        mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)

    }

    public override fun onDestroy() {

        if (mDelayHandler != null) {
            mDelayHandler!!.removeCallbacks(mRunnable)
        }

        super.onDestroy()
    }

アニメーションをアニメーションフォルダーに入れる:

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromXDelta="100%p"
        Android:toXDelta="0%p">
</translate>

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="@Android:integer/config_longAnimTime"
        Android:fromXDelta="0%p"
        Android:toXDelta="-100%p">
</translate>

使用法

  navigateToHomeScreen();
1
Hitesh Sahu

こちらがスライドアニメーションです。

enter image description here

2つのアクティビティがあるとします。

  1. MovieDetailActivity
  2. AllCastActivity

そして、ボタンをクリックすると、これが起こります。

enter image description here

3つの簡単なステップでこれを達成できます

1)コンテンツの移行を有効にする

_style.xml_に移動し、この行を追加してコンテンツの移行を有効にします。

_<item name="Android:windowContentTransitions">true</item>
_

2)AllCastActivityのデフォルトの入力および終了遷移を書き込む

_public void setAnimation()
{
    if(Build.VERSION.SDK_INT>20) {
        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.LEFT);
        slide.setDuration(400);
        slide.setInterpolator(new AccelerateDecelerateInterpolator());
        getWindow().setExitTransition(slide);
        getWindow().setEnterTransition(slide);
    }
}
_

3)インテントでアクティビティを開始

MovieDetailActivityにこのメソッドを記述して、AllCastActivityを開始します

_public void startActivity(){

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());

  if(Build.VERSION.SDK_INT>20)
   {
       ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
       startActivity(i,options.toBundle());
   }
   else {
       startActivity(i);
   }
}
_

最も重要な!

setAnimation()メソッドをsetContentView()メソッドの前に置くと、アニメーションが機能しません。
だから、_AllCastActivity.Java__は次のようになります

_ class AllCastActivity extends AppcompatActivity {

   @Override
   protected void onCreate(Bundle savedInstaceState)
   {
      super.onCreate(savedInstaceState);

      setAnimation();

      setContentView(R.layout.all_cast_activity);

      .......
   }

   private void setAnimation(){

      if(Build.VERSION.SDK_INT>20) {
      Slide slide = new Slide();
      slide.setSlideEdge(Gravity.LEFT);
      ..........
  }
}
_
0
Rohit Singh

スライドアニメーションは、overridePendingTransitionを呼び出して、入退場アクティビティのアニメーションリソースを渡すことで、アクティビティの遷移に適用できます。

スライドアニメーションは、右にスライド、左にスライド、上にスライド、下にスライドできます。

上にスライド

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:interpolator="@Android:anim/linear_interpolator">
    <scale
        Android:duration="800"
        Android:fromXScale="1.0"
        Android:fromYScale="1.0"
        Android:toXScale="1.0"
        Android:toYScale="0.0" />
</set>

スライドダウン

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:interpolator="@Android:anim/linear_interpolator">
    <scale
        Android:duration="800"
        Android:fromXScale="1.0"
        Android:fromYScale="0.0"
        Android:toXScale="1.0"
        Android:toYScale="1.0" />
</set>

overridePendingTransition(R.anim.slide_down、R.anim.slide_up);

アクティビティ遷移の例については、 アクティビティ遷移アニメーションの例 を参照してください。

0
Arnav Rao