71

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

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>
4

9 に答える 9

171

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

R.anim.slide_out_bottom

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="100%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
</set>

R.anim.slide_in_bottom

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="100%" /> 
</set>

そして、ビュークリックリスナーに以下のコード行を記述します。

startActivity(new Intent(MainActivity.this, NameOfTargetActivity.class));
overridePendingTransition(R.anim.slide_out_bottom, R.anim.slide_in_bottom);
于 2013-10-15T05:40:40.577 に答える
124

ここに画像の説明を入力してください

デフォルトのアクティビティアニメーションを上書きすると、overridePendingTransitionよりもパフォーマンスが向上します。私はすべてのAndroidバージョンで機能するこのソリューションを使用しています。4つのファイルをコピーして貼り付け、次のように4行のスタイルを追加します。

「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フォルダーを作成し、次の4つのアニメーションファイルをanimフォルダーに作成します。

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からサンプルプロジェクトをダウンロードできます。

ありがとう

于 2016-10-09T12:53:01.950 に答える
34
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);   
    }
于 2012-04-20T09:31:19.300 に答える
23

いくつかのメモを含むアルファアニメーションで上下にスライドします

ここに画像の説明を入力してください

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);

終わり

詳細ビューモデル( https://www.youtube.com/watch?v=deZobvh2064
など)を表示するときに、iOSアニメーションのようにスライドアニメーションを作成しようとしましたが、失敗しました。

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

それから私はアンドロイドに適用しようとします。
アルファを作るために私は使用<alpha>して成功します。
アニメーションの開始を遅くするよりも速くするために使用しますandroid:interpolator="a decelerate interpolator"が、ほとんど失敗しました。

decelerate interpolatorAndroidには3つのデフォルトがあります
@android:interpolator/decelerate_quad->ファクター=1-
@android:interpolator/decelerate_cubic>ファクター= 1.5_
@android:interpolator/decelerate_quint>ファクター=2.5
(ファクター<=>が高いほど、アニメーションは最初から速く、最後は遅くなります)
これは良いチュートリアルhttp://cogitolearningです。 co.uk/2013/10/android-animations-tutorial-5-more-on-interpolators/理解してください

上記の3つを試しましたが、iOSのように達成できず、アニメーションをiOSのように速く開始できません。次に、factor=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%であるかどうかはわかりませんが、この経験がお役に立てば幸いです。

于 2018-10-05T04:04:46.253 に答える
4

これがあなたのためのスライドアニメーションです。

ここに画像の説明を入力してください

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

  1. MovieDetailActivity
  2. AllCastActivity

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

ここに画像の説明を入力してください

あなたは3つの簡単なステップでこれを達成することができます

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

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

<item name="android:windowContentTransitions">true</item>

2)AllCastActivityのデフォルトのEnterおよびExitトランジションを記述します

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)意図的に活動を開始する

このメソッドをYourMovieDetailActivityに記述して開始します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);
      ..........
  }
}
于 2018-12-15T19:37:12.340 に答える
3

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()
    }

アニメーションを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">
</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();
于 2018-10-27T18:20:37.783 に答える
1

overridePendingTransitionstartActivity代わりにを使用できますonCreate。少なくとも、それは私にとってはうまくいきます!

ここで完全な例を参照してください。これには、(逆)アニメーションonBackPressedが含まれているため、前のアクティビティに戻ります。あなたの特定の例(フェードインとフェードアウト)では、それは不必要かもしれません。

于 2017-06-10T13:15:57.060 に答える
1

うまくいけば、それはあなたのために働くでしょう。

startActivityForResult( intent, 1 , ActivityOptions.makeCustomAnimation(getActivity(),R.anim.slide_out_bottom,R.anim.slide_in_bottom).toBundle());
于 2021-02-19T10:52:27.137 に答える
0

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

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

上にスライドします

<?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);

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

于 2018-04-01T03:59:37.353 に答える