การเปลี่ยนแปลงกิจกรรมใน Android


188

ฉันจะกำหนดช่วงการเปลี่ยนภาพระหว่างสองกิจกรรมสำหรับ Android 1.5 และใหม่กว่าได้อย่างไร ฉันต้องการกิจกรรมที่จะจางหายไป


7
ใช้overridePendingTransitionกับคำตอบที่เกี่ยวข้องทั้งหมดด้านล่าง: คุณสามารถผ่าน(0, 0)หากคุณไม่ต้องการให้มีภาพเคลื่อนไหว
dokkaebi

คำตอบ:


164

Activity.overridePendingTransition()คุณสามารถทำเช่นนี้กับ คุณสามารถกำหนดภาพเคลื่อนไหวการเปลี่ยนแปลงอย่างง่ายในไฟล์ทรัพยากร XML


ขอบคุณ iandisme overridePengingTransition เป็นระดับ API 5 คุณไม่สามารถทำสิ่งนี้กับระดับ 3 (Android 1.5) ได้หรือไม่
hpique

อ่าคุณพูดถูก คำตอบของ CaseyB อาจเป็นไปตามแนวทางที่คุณต้องการ
iandisme

ยังไม่พบวิธีการทำอย่างถูกต้องจางหายไปกับคำตอบของ CaseyB
hpique

1
คุณสามารถทำได้ในonCreateฟังก์ชั่นกิจกรรมของคุณ
mxcl

1
ใน HTC คุณต้องเปลี่ยนการตั้งค่า> แสดง> ภาพเคลื่อนไหวเป็นทั้งหมดเพื่อให้สามารถใช้งานได้ (หรืออย่างน้อยใน HTC Desire HD)
Urboss

192

นี่คือรหัสที่จะทำเรียบเนียนดีระหว่างสองกิจกรรม ..

สร้างไฟล์ที่เรียกว่าfadein.xmlในres/anim

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

สร้างไฟล์ที่เรียกว่าfadeout.xmlในres/anim

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

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />

ถ้าคุณต้องการที่จะจางหายไปจากกิจกรรมเพื่อกิจกรรม Bใส่ต่อไปนี้ในonCreate()วิธีการสำหรับกิจกรรม B ก่อนsetContentView()ทำงานให้ฉัน

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

หากการจางหายช้าเกินไปสำหรับคุณให้เปลี่ยนandroid:durationไฟล์ xml ด้านบนเป็นสิ่งที่เล็กกว่า


54
เพียงเพื่อเพิ่มไปนี้ overridePendingTransition () จะต้องถูกเรียกอีกครั้งหลังจากที่ OS ตัดสินใจปิดกิจกรรมของคุณ ฉันเพิ่งวางสายที่เหมือนกันเพื่อ overridePendingTransition (fadein, fadeout) ในเมธอด onPause () ของกิจกรรม มิฉะนั้นคุณจะเห็นกิจกรรมจางหายไป แต่จะไม่จางหายเมื่อปิด
เนท

2
ไม่มีคำตอบในหัวข้ออื่น ฉันกำลังลบมัน สิ่งที่ฉันกำลังประสบคือสิ่งที่เกิดขึ้นคือการเปลี่ยนแปลงเกิดขึ้นทันทีและจากนั้นมันก็มืดและจางหายไปดังนั้นฉันจึงไปที่กิจกรรม A และกิจกรรม B จะปรากฏขึ้นสลัว ๆ แล้วจางหายไปฉันแก้ไขมันเพื่อทำตามคำแนะนำด้วย การเพิ่มรหัสไปยัง onPause () ของกิจกรรม A และรับพฤติกรรมเดียวกัน
Geeks On Hugs

12
การใช้แอนิเมชั่นแอนดรอยด์ในตัวนั้นส่งผลให้การเปลี่ยนแปลงราบรื่นขึ้น: การoverridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); ดูไฟล์เหล่านั้นอาจให้คำแนะนำเกี่ยวกับวิธีการปรับปรุงแอนิเมชั่นที่คุณกำหนดเอง (เช่นการทำให้จางหายไปนานกว่า
Dan J

3
ก็ไม่ลืมที่จะเปลี่ยนแปลงfadeinและfadeoutการและfade_in fade_outจากโพสต์ของ Dan J
Farid

2
ตามเอกสารที่คุณควรโทรoverridePendingTransition()ขวาหลังจากโทรและfinish() / หรือ startActivity()ฉันทำได้ดีด้วยวิธีนี้โดยเรียกมันว่าหลังจากเปิดตัวกิจกรรมใหม่
Ionoclast Brigham

50

วิธีง่ายๆในการทำคือ:

  1. สร้างสไตล์แอนิเมชั่นลงในไฟล์ styles.xml ของคุณ
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. เพิ่มสไตล์นี้ให้กับธีมแอปของคุณ
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

แค่นั้นแหละ :)


31

ใช่. คุณสามารถบอกระบบปฏิบัติการว่าคุณต้องการเปลี่ยนแปลงอะไรสำหรับกิจกรรมของคุณ

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

โดยที่ ANIMATION เป็นจำนวนเต็มที่อ้างถึงภาพเคลื่อนไหวที่มีอยู่แล้วในระบบปฏิบัติการ


ฉันต้องทำอย่างอื่นเพื่อให้ทำงานได้หรือไม่ getWindow (). setWindowAnimations (android.R.anim.fade_in) ไม่ส่งผลให้เกิดการเปลี่ยนแปลงแบบพุชที่ใช้โดยค่าเริ่มต้น กิจกรรมใหม่จะปรากฏเหนือกิจกรรมก่อนหน้าในอุปกรณ์ Nexus One
hpique

1
นั่นเป็นเพราะสิ่งนี้ไม่ได้ขอทรัพยากร แต่เป็นการขอรหัสของภาพเคลื่อนไหวการเปลี่ยนแปลงที่มีอยู่ในระบบปฏิบัติการ developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
ดูเหมือนว่า setWindowAnimations ยอมรับเฉพาะทรัพยากรสไตล์เท่านั้น getWindow (). setWindowAnimations (android.R.style.Animation_Toast) นั้นใกล้เคียงที่สุดที่ฉันเคยเจอ แต่จางหายไปจากสีดำไม่ใช่กิจกรรมก่อนหน้า
hpique

1
มันไม่จำเป็นต้องสร้างขึ้นในภาพเคลื่อนไหวในระบบปฏิบัติการคุณสามารถกำหนดค่าที่กำหนดเองได้
ilija139

1
@ ilija139 คุณแน่ใจหรือไม่? มันบอกว่าที่นี่developer.android.com/reference/android/view/ ...... : "นี่จะต้องเป็นทรัพยากรของระบบมันไม่สามารถเป็นทรัพยากรของแอปพลิเคชันได้เพราะตัวจัดการหน้าต่างไม่สามารถเข้าถึงแอปพลิเคชัน"
ไพฑูรย์

29

สร้างความต้านทาน> anim> fadein.xml

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

สร้าง res> anim> fadeout.xml

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

ใน res> values> styles.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

ในกิจกรรม onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
ฉันอยากจะแนะนำให้เพิ่มเข้าไปในธีมดังนั้นมันจึงถูกนำไปใช้กับทุกกิจกรรม
Peterdk

12
ภาพเคลื่อนไหวเหล่านี้มีการกำหนดไว้แล้วใน Android เพียงเพิ่มรหัสต่อไปนี้ใน onPause () ของกิจกรรมทั้งหมด:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

ใช่แค่ต้องการแสดงให้เห็นว่าแอนิเมชันสามารถแก้ไขได้โดยนักพัฒนาที่ชื่นชอบ
IceSteve

29

สำหรับรายการภาพเคลื่อนไหวเริ่มต้นโปรดดูที่: http://developer.android.com/reference/android/R.anim.html

มีอยู่จริงfade_inและfade_outสำหรับ API ระดับ 1 ขึ้นไป


2
เช่น getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Pierre

5
ไชโยพาฉันไปที่ Googling เป็นระยะเวลานานเพื่อค้นหาสิ่งเหล่านี้
georgiecasey

25

ฉันเขียนทับภาพเคลื่อนไหวกิจกรรมเริ่มต้นของฉัน ฉันทดสอบใน api 15 ว่าทำงานได้อย่างราบรื่น นี่คือทางออกที่ฉันใช้:

<!-- 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 จากนั้นสร้างไฟล์แอนิเมชันสี่ไฟล์:

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>

คุณสามารถดาวน์โหลดของฉันโครงการตัวอย่าง

นั่นคือทั้งหมด ... :)


นี่ควรเป็นคำตอบที่ยอมรับได้ ทำได้ดี!
EdgeDev

24

นี่คือรหัสที่จะทำให้ราบรื่นระหว่างสองกิจกรรม

  1. ผลราบรื่นจากซ้ายไปขวา

    สร้างไฟล์ชื่อ slide_in_right.xml และ slide_out_right.xml ใน res / anim

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. ผลราบรื่นจากขวาไปซ้าย

    สร้างไฟล์ชื่อ animation_enter.xml และ animation_leave.xml ใน res / anim

    animation_enter.xml

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

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. นำทางจากกิจกรรมหนึ่งไปยังกิจกรรมที่สอง

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4. เมื่อกดกลับเหตุการณ์หรือนำทางจากกิจกรรมที่สองไปยังหนึ่งกิจกรรม

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();

3
overridePendingTransition ควรอยู่หลัง startActivity ใน 3
2559

overridePendingTransition ควรอยู่หลัง startActivity ใน 3 และ 4
Tareq

มันไม่ทำงานสำหรับฉันถ้า overridePendingTransition () ใส่ก่อน startActivity ()
Fernando Tan

ควรโทรoverridePendingTransitionทันทีหลัง startActivity: developer.android.com/reference/android/app/…
Midhun MP

4

คุณไม่สามารถใช้ overridePendingTransition ใน Android 1.5 overridePendingTransistion มาถึง Android 2.0

หากคุณจะทำสิ่งนี้โดยไม่มีข้อผิดพลาดคุณต้องรวบรวมเป้าหมาย (1.5 หรือสูงกว่า) โดยใช้ภาพเคลื่อนไหวปกติ (หรือคุณเป็นเจ้าของ) หรือคุณต้องรวบรวมเป้าหมาย (2.0 หรือสูงกว่า) โดยใช้ overridePendingTransistion

สรุป: คุณไม่สามารถใช้ overridePendingTransistion ใน Android 1.5

คุณสามารถใช้ภาพเคลื่อนไหวในตัวในระบบปฏิบัติการได้


นั่นไม่ถูกต้อง ภาพเคลื่อนไหวอยู่ใน Android ก่อน 1.6 และคุณสามารถใช้ overridePendingTransistion พร้อมการสะท้อนไปยังเป้าหมาย 1.5
hpique

ความผิดพลาดของฉัน อัปเดตโพสต์ของฉัน คุณสามารถทำแอนิเมชั่นของคุณเองและปรับแต่งได้ตามที่คุณต้องการใน 1.5 แต่คุณยังคงไม่สามารถใช้ overridePendingTransition ได้ตั้งแต่เริ่มปรากฏใน API ระดับ 5
Curtain

2

ในอุปกรณ์ GALAXY:

คุณต้องแน่ใจว่าคุณไม่ได้ปิดมันลงในอุปกรณ์โดยใช้การตั้งค่า> ตัวเลือกสำหรับนักพัฒนา:

สองกระบอก


แม้สำหรับอุปกรณ์ LG :)
Ultimo_m

ฉันคิดอย่างนั้น แต่ฉันไม่ลอง
เฮอร์อิสมาอิล

Fantastic! ฉันพบคำตอบของคุณหลังจากผ่านไปหลายชั่วโมงในการค้นหาช่วงการเปลี่ยนภาพและภาพเคลื่อนไหว
CoolMind


1

ก่อนที่จะเริ่มเจตนาของคุณ:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

สิ่งนี้จะให้แอนิเมชั่นเริ่มต้นสำหรับการเปลี่ยนกิจกรรมของคุณ


0

Android บางรุ่นรองรับการActivityเปลี่ยนถ่ายที่กำหนดเองและบางรุ่นไม่รองรับ (อุปกรณ์รุ่นเก่า) หากคุณต้องการที่จะใช้การเปลี่ยนที่กำหนดเองเป็นวิธีที่ดีที่จะตรวจสอบว่าActivityมีoverridePendingTransition()วิธีการหรือไม่

หากต้องการทราบว่ามีวิธีการดังกล่าวหรือไม่สามารถใช้ API การสะท้อนกลับได้ นี่คือรหัสง่าย ๆ ที่จะตรวจสอบและส่งคืนเมธอดหากมีอยู่:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

จากนั้นเราสามารถใช้การเปลี่ยนแปลงของเราเองเช่นใช้วิธีนี้หากมีอยู่:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

ตัวอย่างเช่นภาพเคลื่อนไหวเฟดอินและเฟดเอ้าท์ง่าย ๆ ถูกใช้สำหรับการสาธิตการเปลี่ยนภาพ


0

ขยายภาพเคลื่อนไหวออก

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

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

zoom_exit

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:fillAfter="true"
    android:duration="500" />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.