ฉันจะเพิ่มแอนิเมชั่นในกิจกรรมเสร็จสิ้นได้อย่างไร ()


100

ฉันใช้ overridePendingTransition เมื่อมีการสร้างกิจกรรมของฉันและใช้งานได้ดีฉันเห็นว่าการจางหายไปในการทำงานที่ดี แต่เมื่อฉันพยายามเคลื่อนไหวจนจบกิจกรรมมันยังคงทำสไลด์ขวาไปซ้ายตามค่าเริ่มต้น

ฉันพยายามกำหนดภาพเคลื่อนไหวออกเป็นครั้งแรกเมื่อฉันเริ่มกิจกรรมดังนี้:

Intent myIntent = new Intent(a, SkdyAlert.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    a.startActivity(myIntent);
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
        AnimationHelper.overridePendingTransition(a, R.anim.fadein, R.anim.fadeout);
    }

จากนั้นฉันก็ลองทำมันเมื่อเสร็จสิ้นกิจกรรมเช่นกัน

okBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            finish();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
                AnimationHelper.overridePendingTransition(activity, 0, R.anim.fadeout);
            }
        }
    });

แต่วิธีการทั้งสองวิธีนี้จะป้องกันไม่ให้สไลด์ "ขวาไปซ้าย" สำหรับภาพเคลื่อนไหวออก มีความคิดเกี่ยวกับสิ่งที่ฉันทำผิดหรือไม่?

คำตอบ:


230

ฉันลบล้างการเปลี่ยนแปลงที่รอดำเนินการหลังจากการโทรเสร็จสิ้น ();

ในกรณีของฉันฉันได้ทำเพื่อหลีกเลี่ยงการเปลี่ยนภาพ

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

คำสั่งเป็นสิ่งสำคัญ :)


5
โดย "รายละเอียด" @Goofyahead ตั้งชื่อกิจกรรมที่แนบมาของเขา - ymmv เทคนิคนี้ใช้ได้ผลสำหรับฉันในการแทนที่แอนิเมชั่นจาก Theme Dialog บน 2.x แต่ไม่ใช่ 3.x หรือ 4.x
larham1

9
อย่างไรR.anim.nothingมีลักษณะอย่างไร
รองเท้าแตะ

ใช้คำตอบ @Felipe Micaroni Lalli 0 หมายถึงไม่มีภาพเคลื่อนไหว
Yeung

เช่นนี้ช่วยฉันด้วย อธิบายวิธีกำหนดภาพเคลื่อนไหวของคุณเอง: stackoverflow.com/questions/5151591/…
Adam

24
คุณสามารถแทนที่finish()วิธีการเพื่อหลีกเลี่ยงการเปลี่ยนได้ในทุกกรณี (กดปุ่มย้อนกลับเป็นตัวอย่าง): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek

31

คำถามนี้มีคำตอบแล้ว แต่วิธีที่มีประสิทธิภาพที่สุดในการใส่ภาพเคลื่อนไหวขณะออกจากกิจกรรมคือการลบล้างเมธอด "finish ()" ของกิจกรรมที่เกี่ยวข้อง:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}

25

ฉันขอแนะนำให้ใช้ isFinishing () วิธีการกำหนดค่าภาพเคลื่อนไหวที่ onPause แทนการเรียกเสร็จสิ้น ()

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}

ทำไมถึงดีกว่า?
Manuel


19

ฉันแก้ไขปัญหานี้โดยใช้วิธีการนี้:

เพื่อเปิดด้วยภาพเคลื่อนไหว:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

หากต้องการปิดด้วยภาพเคลื่อนไหว:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_out_right,R.anim.slide_in_right);
}

12

ดูการทำผ่านธีม คุณสามารถกำหนดภาพเคลื่อนไหวเข้าออกสำหรับกิจกรรมหรือทั้งแอปพลิเคชัน


ใช่! นั่นแหล่ะ ดีนะ ฉันใช้ธีมไปแล้วและธีมนั้นมีการกำหนดแอนิเมชั่นดังนั้นฉันจึงไม่สามารถทำให้แอนิเมชั่นของตัวเองทำงานได้ ขอบคุณมากสำหรับข้อมูลเชิงลึก!
b-ryce

3
ขอคำแนะนำหน่อยได้ไหมว่าธีมไหนจะส่งทรานสิสต์ ฉันต้องการตั้งค่าการเปลี่ยนแปลงที่กำหนดเองไปยังไซต์ทั้งหมด แต่ฉันไม่รู้วิธี
LuckyMalaka

@Zapnologica คำตอบอื่น ๆ ที่ฉันให้ไว้สำหรับคำถามที่คล้ายกันนี้จะสะกดมันให้มากขึ้น stackoverflow.com/questions/4940574/…
Nathan Schwermann

6

ตามคำตอบของ @schwiz ต่อไปนี้เป็นภาพเคลื่อนไหวแทนที่สำหรับชุดรูปแบบโต้ตอบในตัวซึ่งฉันได้กำหนดภาพเคลื่อนไหว slide_up และ slide_down ในเครื่อง กิจกรรมของฉันระบุธีม MyDialog เพื่อให้มีการเปลี่ยนเข้าและออกเหล่านี้

<style name="Animation.MyDialog" parent="android:Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

<style name="Theme.MyDialog" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/Animation.MyDialog</item>
</style>


5

ใช้ startActivityForResult เพื่อเริ่มกิจกรรมลูกของคุณและใน onActivityResult () ของกิจกรรมหลักของคุณ:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_YOUR_ACTIVITY) {
        overridePendingTransition(R.anim.parent_appearing_anim, R.anim.child_dissmissing_anim);
    }
    super.onActivityResult(requestCode, resultCode, arg2);
}

วิธีนี้ใช้ได้กับการกดย้อนกลับ (ปุ่มกด) เพื่อให้ใช้งานได้กับลูกศร "ขึ้น" โปรดดูคำตอบนี้: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- clicked / 20161352 # 20161352
lenooh

สิ่งสำคัญที่ควรทราบ: ต้องเรียก overridePendingTransition ก่อนที่จะเรียก super.onActivityResult มิฉะนั้นการเปลี่ยนแปลงที่เกิดขึ้นจะไม่ถูกแทนที่!
goemic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.