2018/10/31

[Android] Switch Activity with Transition Animation

這篇要來寫如何切換 Activity ,另外在切換的時候還可以加入轉場的特效。

首先在 res/ 建立一個 anim 資料夾 (一定要用 anim 命名)
並且在裡面依照想要的轉場效果,建立對應的 xml
由右滑入 slide_in_right.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="100%"
  5. android:toXDelta="0"
  6. android:duration="200" />
  7. </set>

向右滑出 slide_out_right.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="0"
  5. android:toXDelta="100%"
  6. android:duration="200" />
  7. </set>

如果想要其他特效,在這篇文章最後面會寫。

在 res/layout 建立一個 xml 給第二個 activity 用
activity_second.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. xmlns:app="http://schemas.android.com/apk/res-auto">
  6.  
  7. <TextView
  8. android:id="@+id/textView"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_marginEnd="8dp"
  12. android:layout_marginStart="8dp"
  13. android:layout_marginTop="8dp"
  14. android:text="Second Activity"
  15. app:layout_constraintEnd_toEndOf="parent"
  16. app:layout_constraintStart_toStartOf="parent"
  17. app:layout_constraintTop_toTopOf="parent" />
  18.  
  19. <Button
  20. android:id="@+id/id_btn01"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_marginEnd="8dp"
  24. android:layout_marginStart="8dp"
  25. android:layout_marginTop="8dp"
  26. android:text="Back"
  27. app:layout_constraintEnd_toEndOf="parent"
  28. app:layout_constraintStart_toStartOf="parent"
  29. app:layout_constraintTop_toBottomOf="@+id/textView"
  30. android:onClick="onClickGoActivityFromSecond"/>
  31.  
  32. </android.support.constraint.ConstraintLayout>

然後在 java 資料夾裡面加入第二個 activity.java
SecondActivity.java:
  1. public class SecondActivity extends AppCompatActivity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_second);
  7.  
  8. }
  9.  
  10. public void onClickGoActivityFromSecond(View v){
  11. finish();
  12. overridePendingTransition(R.anim.none, R.anim.slide_out_right);
  13. }
  14. }

其中在這行可以選擇切換時想要的轉場特效
overridePendingTransition(R.anim.slide_in_right, R.anim.none);

在主要的 main activity 裡設定一個按鈕按下去切換到第二個 Activity
activity_main.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context="com.example.chris.myapplication.MainActivity">
  8.  
  9. <TextView
  10. android:id="@+id/textView"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_marginEnd="8dp"
  14. android:layout_marginStart="8dp"
  15. android:layout_marginTop="8dp"
  16. android:text="MainActivity"
  17. app:layout_constraintEnd_toEndOf="parent"
  18. app:layout_constraintStart_toStartOf="parent"
  19. app:layout_constraintTop_toTopOf="parent" />
  20.  
  21. <Button
  22. android:id="@+id/id_btn01"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_marginEnd="8dp"
  26. android:layout_marginStart="8dp"
  27. android:layout_marginTop="8dp"
  28. android:text="Go Second"
  29. app:layout_constraintEnd_toEndOf="parent"
  30. app:layout_constraintStart_toStartOf="parent"
  31. app:layout_constraintTop_toBottomOf="@+id/textView"
  32. android:onClick="onClickGoActivityFromMain"/>
  33.  
  34. </android.support.constraint.ConstraintLayout>
  35.  
MainActivity:
  1. public class MainActivity extends AppCompatActivity{
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7.  
  8. }
  9.  
  10. public void onClickGoActivityFromMain(View v){
  11. startActivity(new Intent(this, SecondActivity.class));
  12. overridePendingTransition(R.anim.slide_in_right, R.anim.none);
  13. }
  14. }

最後記得在 AndroidManifest.xml 裡面註冊第二個 Activity
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.chris.myapplication">
  4.  
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@mipmap/ic_launcher"
  8. android:label="@string/app_name"
  9. android:roundIcon="@mipmap/ic_launcher_round"
  10. android:supportsRtl="true"
  11. android:theme="@style/AppTheme">
  12. <activity
  13. android:name=".MainActivity">
  14. <intent-filter>
  15. <action android:name="android.intent.action.MAIN" />
  16.  
  17. <category android:name="android.intent.category.LAUNCHER" />
  18. </intent-filter>
  19. </activity>
  20.  
  21. <activity
  22. android:name=".SecondActivity"
  23. android:screenOrientation="portrait">
  24. </activity>
  25.  
  26. </application>
  27. </manifest>

附上其他的轉場效果 xml 的寫法
無效果 none.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="0"
  5. android:toYDelta="0%"
  6. android:duration="300" />
  7. </set>

淡入 fade_in.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <alpha
  4. android:fromAlpha="0.0"
  5. android:toAlpha="1.0"
  6. android:duration="300" />
  7. </set>

淡出 fade_out.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <alpha
  4. android:fromAlpha="1.0"
  5. android:toAlpha="0.0"
  6. android:duration="300" />
  7. </set>

由下滑入 slide_in_bottom.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="100%"
  5. android:toYDelta="0"
  6. android:duration="300" />
  7. </set>

由左滑入 slide_in_left.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="-100%"
  5. android:toXDelta="0"
  6. android:duration="200" />
  7. </set>

由右滑入 slide_in_right.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="100%"
  5. android:toXDelta="0"
  6. android:duration="200" />
  7. </set>

由上滑入 slide_in_top.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="-100%"
  5. android:toYDelta="0"
  6. android:duration="300" />
  7. </set>

由上滑入淡入 slide_in_top_fade.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="-100%"
  5. android:toYDelta="0"
  6. android:duration="500" />
  7. <alpha
  8. android:fromAlpha="0"
  9. android:toAlpha="1.0"
  10. android:duration="250"
  11. android:repeatMode="reverse"
  12. android:startOffset="0" />
  13. </set>

向下滑出 slide_out_bottom.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="0"
  5. android:toYDelta="-100%"
  6. android:duration="300" />
  7. </set>

向左滑出 slide_out_left.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="0"
  5. android:toXDelta="-100%"
  6. android:duration="200" />
  7. </set>

向右滑出 slide_out_right.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="0"
  5. android:toXDelta="100%"
  6. android:duration="200" />
  7. </set>

向上滑出 slide_out_top.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="0"
  5. android:toYDelta="100%"
  6. android:duration="300" />
  7. </set>

向上滑出淡出 slide_out_top_fade.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromYDelta="0"
  5. android:toYDelta="100%"
  6. android:duration="650" />
  7. <alpha
  8. android:fromAlpha="1.0"
  9. android:toAlpha="0"
  10. android:duration="500"
  11. android:repeatCount="1"
  12. android:repeatMode="reverse"
  13. android:startOffset="0" />
  14. </set>


END

沒有留言:

張貼留言