การเปลี่ยนการกะพริบหลังจากการเปลี่ยนการวางแนว

อัปเดต

ฉันเปิดข้อบกพร่องกับ Google แล้ว https://issuetracker.google.com/issues/63663775

ฉันกำลังพยายามจ้าง makeSceneTransitionAnimation ภายในแอปพลิเคชัน Android ปัจจุบันของฉัน

ฉันมีแหล่งที่มา Activity ซึ่งมี Fragment และภายใน Fragment คือ RecyclerView

เมื่อฉันคลิกที่รูปภาพใน RecyclerView ฉันจะเปลี่ยนไปยังเป้าหมาย Activity ของฉันที่มีแฟรกเมนต์ซึ่งแสดงรูปภาพอย่างถูกต้องด้วยแอนิเมชั่นที่ยอมรับได้

การกดปุ่มย้อนกลับจะเป็นการกลับภาพเคลื่อนไหวอย่างถูกต้อง

การทำงานข้างต้นทำงานได้ดีทั้งในแนวตั้งและแนวนอน

ปัญหาการกะพริบเกิดขึ้นเมื่อฉันเปลี่ยนการวางแนวในขณะที่ดู Fragment เป้าหมาย จากนั้นกดปุ่มย้อนกลับ

มีปัญหาอื่นๆ เช่น รูปภาพไม่กลับไปยังตำแหน่งเดิมโดยตรง และในอุปกรณ์รุ่นเก่า ฉันเห็นเส้นแนวนอนเหมือนกับการรบกวนจากโทรทัศน์อะนาล็อกที่ปรับจูนไม่ดี

การกะพริบซึ่งแย่มาก หน้าจออุปกรณ์จะเป็นสีดำสนิทเป็นเวลาประมาณ 500 มิลลิวินาที

ฉันได้ดาวน์โหลดและปรับใช้แอปการเปลี่ยนองค์ประกอบที่ใช้ร่วมกันตัวอย่างของ Google แล้ว และดูเหมือนว่าจะมี "ฟีเจอร์" เดียวกัน

ฉันได้ลองใช้วิธีแก้ไขปัญหาหลายวิธีแล้ว แต่วิธีใดวิธีหนึ่งไม่ได้ผล เช่น นี้.

นี่คือตัวอย่างที่แสดงปัญหา

เพิ่ม LOGCAT แล้ว

07-21 12:57:18.097 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=30KB, data=21KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=30KB, data=23KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 128KB
07-21 12:57:20.540 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/home/search-1/?company_name=Happy http/1.1
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 256KB
07-21 12:57:21.084 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/home/search-1/?company_name=Happy (543ms, unknown-length body)
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=124KB, data=93KB
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=98KB, data=59KB
07-21 12:57:22.377 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 512KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile boolean org.jsoup.parser.HtmlTreeBuilderState$7.process(org.jsoup.parser.Token, org.jsoup.parser.HtmlTreeBuilder)
07-21 12:57:22.701 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=245KB, data=178KB
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=216KB, data=130KB
07-21 12:57:25.040 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/companies/happy-print-printing-house/34896 http/1.1
07-21 12:57:25.101 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=true
07-21 12:57:25.437 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/companies/happy-print-printing-house/34896 (396ms, unknown-length body)
07-21 12:57:26.111 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:26.123 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=251KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=249KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 1024KB
07-21 12:57:26.173 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:26.177 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:26.186 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:26.226 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:26.232 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:26.238 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:26.244 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:26.265 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 8MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:26.437 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:26.579 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
07-21 12:57:27.754 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:27.761 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:27.765 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:27.772 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:27.784 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:27.788 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:27.792 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:27.796 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:29.889 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.117 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.756 1962-1962/com.incentive.yellowpages W/AutofillManager: Session 409360048 could not be restored
07-21 12:57:30.922 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=498KB, data=362KB
07-21 12:57:30.923 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=445KB, data=262KB

comment
อาจอยู่ที่นี่: github.com/saulmm/Android-Material-Examples   -  person RonTLV    schedule 14.07.2017
comment
คุณสามารถโพสต์วิดีโอที่มีพฤติกรรมได้หรือไม่?   -  person azizbekian    schedule 14.07.2017
comment
@azizbekian ฉันได้เพิ่มลิงก์ไปยังวิดีโอแล้ว BLINK เกิดขึ้นที่ 0.06 (หรือหลังจากนั้น)   -  person Hector    schedule 14.07.2017
comment
คำตอบของ @azizbekian จะหยุดพฤติกรรม BLINK ได้อย่างแน่นอน แต่วิธีนี้ไม่เป็นที่ยอมรับสำหรับสถานการณ์เฉพาะของฉัน โดยคงมุมมองแนวนอนเป็นแนวตั้งในขณะที่การเปลี่ยนภาพเสร็จสิ้นจะปล่อยให้ด้านบนและด้านล่างของหน้าจอว่างเปล่า ซึ่งเกือบจะแย่เท่ากับอาการเดิมของการกะพริบทั้งหน้าจอ คงจะดีถ้าเข้าใจว่าเหตุใด BLINK จึงเกิดขึ้น ฉันไม่สามารถยอมรับได้ว่าการกะพริบตาเกิดขึ้นเพียงเพราะหน้าจอถูกสร้างขึ้นใหม่เนื่องจากการเปลี่ยนการวางแนว   -  person Hector    schedule 21.07.2017
comment
By keeping the landscape view in portrait... - คุณช่วยอธิบายความหมายของสิ่งนี้ได้ไหม ...leaves the top and bottom of the screen BLANK - อาจมีวิดีโอบ้างไหม?   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian ก่อนอื่นฉันต้องยอมรับว่าฉันไม่สามารถสร้างโครงการ github ของคุณและปรับใช้บนอุปกรณ์ O ของฉันได้ ดังนั้นฉันจึงไปจาก GIF ที่แนบมาของคุณเท่านั้น ดูเหมือนว่าโปรเจ็กต์ของคุณจะเป็นทั้ง Java และ Kotlin แต่ Kotlin ไม่ใช่ตัวเลือกที่ฉันสามารถใช้ได้ ใน GIF ของคุณ ปรากฏว่าเมื่อการวางแนวหน้าจอเกิดขึ้นและการเปลี่ยนผ่านเสร็จสิ้นอุปกรณ์ของคุณจะอยู่ในแนวตั้งโดยที่การแสดงผลหน้าจอยังคงแสดงมุมมองแนวนอน นี่อาจเป็นความผิดพลาดของฉัน เนื่องจาก GIF ของคุณไม่แสดงเหตุการณ์การคลิกบนหน้าจอ ดังนั้นจึงไม่สามารถบอกได้ว่าเมื่อใดที่กดกลับ   -  person Hector    schedule 21.07.2017
comment
@Hector โครงการไม่ได้รับการดูแล เพิ่งตรวจสอบและพบว่าไม่มีการสร้างอีกต่อไป อัปเกรดปลั๊กอินบางส่วน ผลักดันการเปลี่ยนแปลง ตอนนี้สร้างและทำงานบน Android O   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian ฉันเพิ่งสร้างและปรับใช้แอปสมุดหน้าเหลืองของคุณบนอุปกรณ์ O ของฉัน (PIXEL XL) และมันมีคุณสมบัติ BLINK ดังที่แสดงไว้ที่นี่ youtu.be/tGA_DGx6lbU   -  person Hector    schedule 21.07.2017
comment
@Hector ว้าว นั่นน่าสนใจจริงๆ น่าเสียดายที่ฉันไม่มีอุปกรณ์ที่มี O และโปรแกรมจำลองไม่ตอบสนองอย่างมาก ติดขัดและโหลดซ้ำโดยไม่มีเหตุผล มีอะไรอยู่ใน logcat หรือไม่?   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian ฉันได้เพิ่ม logcat ทั้งหมดจากวิดีโอแล้ว   -  person Hector    schedule 21.07.2017
comment
ฉันไม่ชอบบรรทัดเหล่านี้: zygote64: Compiler จัดสรร 8MB เพื่อคอมไพล์.... ดูเหมือนว่า android O จะเข้มงวดเกินไป   -  person azizbekian    schedule 21.07.2017


คำตอบ (3)


ปัญหาคือ: คุณกำลังเริ่ม Activity2 ในโหมดแนวตั้ง และกลับมาที่ Activity1 ในโหมดแนวนอน แต่เนื่องจากคุณได้ดำเนินการเปลี่ยนแปลงการวางแนว ลำดับชั้นการดูของ Activity1 จึงถูกทำลายและสร้าง ดังนั้นจึงไม่มี View ที่เดิมเป็นจุดเริ่มต้นของการเปลี่ยนแปลงอีกต่อไป

สิ่งที่คุณสามารถทำได้คือแมปมุมมองใหม่จากอันเก่าไปเป็นอันใหม่โดยใช้ Activity#setExitSharedElementCallback() API ยังมีงานอีกเล็กน้อยที่ต้องทำเพื่อจัดการกับสถานการณ์นั้น ซึ่งฉันได้อธิบายไว้แล้วทีละขั้นตอนในสิ่งนี้ ตอบ

ทางเลือกที่ดีที่สุดสำหรับคุณคือลองดู Alex Lockwood ของ แอปที่ github ด้วยฟังก์ชันที่คุณต้องการ คุณจะเข้าใจวิธีจัดการกับสถานการณ์ได้ง่ายขึ้นมาก

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {

            if (we are coming back to Activity1) {
                View newSharedElement = findViewById(R.id.your_imageview);
                if (newSharedElement != null) {
                    names.clear();
                    names.add("transition name");
                    sharedElements.clear();
                    sharedElements.put("transition name", newSharedElement);
                }
            } else {
                // we are leaving Activity1
            }
        }
    });
}

โดยพื้นฐานแล้ว คุณกำลังล้างแผนที่และเพิ่มคู่ "ชื่อการเปลี่ยนแปลง-มุมมอง" ใหม่ลงไป คุณสามารถดูวิธีการตรวจสอบ if (we are coming back to Activity1) ได้สำเร็จ ที่นี่


นี่คือฟีเจอร์ที่ใช้งานใน หนึ่งในแอปของฉัน

ป้อนคำอธิบายรูปภาพที่นี่

person azizbekian    schedule 14.07.2017
comment
youtu.be/CigNib7UI3g วิดีโอนี้แสดงให้เห็นว่าแอปพลิเคชันของ Alex มีปัญหาเดียวกันทุกประการเกี่ยวกับการเปลี่ยนการวางแนว - person Hector; 14.07.2017
comment
ฉันขอขอบคุณงานที่คุณนำไปใช้กับใบสมัครตัวอย่างของคุณ แน่นอนว่าไม่มีการกะพริบตา อย่างไรก็ตาม แนวทางที่คุณดำเนินการไม่เป็นที่ยอมรับสำหรับแอปพลิเคชันเฉพาะของฉัน วิธีการของคุณในการรักษา UI แนวนอนเมื่อกลับสู่แนวตั้งจะแสดงหน้าจอว่างเปล่าจำนวนมาก - person Hector; 16.07.2017
comment
ดังที่ @Hector กล่าวไว้ แอปตัวอย่างของ AlexLockwood มีปัญหาการกะพริบ ฉันเห็นได้บน Nexus 5X แต่ไม่เห็นบน Samsung Galaxy Note 5 ฉันขอแนะนำให้คุณทดสอบแอปของคุณบน Nexus อาจไม่ใช่ข้อบกพร่องของ Nexus 5X เนื่องจากแอป Google Photos ไม่ได้รับผลกระทบใน 5X ดังนั้นจึงมีวิธีทำให้มันใช้งานได้โดยซ่อนอยู่ที่ไหนสักแห่ง... - person Tim Autin; 30.11.2017

ฉันคิดว่าปัญหาอยู่ที่ขอบเขตเค้าโครง ImageView เนื่องจากการเปลี่ยนฉากจะคำนวณความแตกต่างระหว่างตำแหน่งเริ่มต้นและตำแหน่งสิ้นสุด จากนั้นสร้างภาพเคลื่อนไหวความแตกต่าง แต่ตำแหน่งสิ้นสุดมีการเปลี่ยนแปลงเนื่องจากการเปลี่ยนการวางแนว คุณสามารถลองและสร้างเค้าโครงสิ้นสุดใหม่ทันทีที่คุณ backpress ในกรณีที่มีการเปลี่ยนแปลงการวางแนวอาจเป็น ฉันผิด แต่คิดได้เฉพาะสถานการณ์นี้เท่านั้น คุณสามารถให้รหัสสำหรับสิ่งเดียวกันได้หรือไม่ (มันใหญ่เกินไปที่จะเพิ่มเป็นความคิดเห็นจึงต้องเพิ่มเป็นคำตอบ)

person Ankit Khare    schedule 14.07.2017

ดูเหมือนว่าจะเกิดขึ้นเฉพาะกับ Oreo เท่านั้น สามารถทำซ้ำได้บนตัวจำลอง API 26 โดยใช้โปรเจ็กต์ตัวอย่างของ Google ซึ่งมีให้ที่นี่: https://github.com/googlesamples/android-ActivitySceneTransitionBasic/#readme

ฉันจัดการเพื่อแก้ไขปัญหาในแอปของฉันโดยเพิ่มสิ่งนี้:

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

สู่สไตล์กิจกรรมรายละเอียดของฉัน

person Tim Autin    schedule 20.12.2017