7

Tôi muốn sử dụng Chuyển đổi hoạt động mới của Android Lollipop. Nhưng hiện tại tôi đang nhìn thấy những con quái vật rất lạ trong các hình động. Tôi đã tấn công với nhau những mẫu nhỏ nhất mà tôi có thể nghĩ đến.Trục trặc trong quá trình chuyển đổi hoạt động với các thành phần được chia sẻ

Đây là những gì tôi đã làm trong một phiên bản rất ngắn:

  1. Bật hiệu ứng chuyển tiếp nội dung cửa sổ trong tôi styles.xml
  2. Được tham chiếu rất đơn giản slide.xml như chuyển cảnh trong phong cách của tôi
  3. Cung cấp một android:transitionName cho một phần tử được chia sẻ trong cả hai bố cục
  4. Được gọi là ActivityOptions.makeSceneTransitionAnimation() với tên đó và chế độ xem tôi muốn chia sẻ
  5. Pa ssed bó dẫn đến startActivity()

Đây là hành vi tôi thấy (thử 10x tốc độ hình ảnh động chậm hơn để xem những gì tôi có nghĩa): Ngay trước khi các hình ảnh động trượt trượt xuống các quan điểm mà không được chia sẻ, những quan điểm nhảy xuống một chút. Họ thực sự di chuyển một chút ngoài.

Nhưng: Điều này chỉ xảy ra trong thời gian giây thứ hai khi tôi chạy hoạt ảnh đó (và mỗi lần sau đó). Vượt qua đầu tiên có vẻ tốt. Và điều này cũng chỉ xảy ra nếu tôi muốn chia sẻ một yếu tố với hoạt động tiếp theo. Tất cả mọi thứ hoạt động tốt nếu tôi không cố gắng chia sẻ một yếu tố.

Đây là mã của tôi:

giá trị/styles.xml

<resources> 
<style name="AppTheme" parent="android:Theme.Material.Light"> 
    <!-- enable window content transitions --> 
    <item name="android:windowContentTransitions">true</item> 

    <!-- specify exit transition --> 
    <item name="android:windowExitTransition">@transition/slide</item> 
</style> 
</resources> 

chuyển/slide.xml

<slide /> 

Layout cho hoạt động chính

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#0000ff" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#00ff00" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#0000ff" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#00ff00" /> 

    </LinearLayout> 

    <!-- the actual element I want to share --> 
    <View 
     android:id="@+id/view" 
     android:layout_width="56dp" 
     android:layout_height="56dp" 
     android:background="#ff0000" 
     android:elevation="8dp" 
     android:transitionName="view" /> 

</RelativeLayout> 

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener { 

    View mView; 

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

     mView = findViewById(R.id.view); 
     mView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, "view"); 

     Intent intent = new Intent(this, SecondaryActivity.class); 
     startActivity(intent, options.toBundle()); 
    } 


} 
+0

Mã bạn sử dụng cho quá trình chuyển đổi phần tử được chia sẻ ở đâu? Tôi thấy rằng bạn đã chỉ định một 'windowExitTransition' trong kiểu của bạn, nhưng làm thế nào bạn thiết lập' windowSharedElementExitTransition'? Ngoài ra, mã bố cục hoạt động thứ hai của bạn trông như thế nào? –

+0

Ngoài ra, liệu hành vi tương tự có xảy ra nếu bạn cung cấp cho các chế độ xem không được chia sẻ của bạn được cố định chiều cao (thay vì đặt 'layout_weight =" 1 "' cho mỗi chế độ xem trong bố cục hoạt động đầu tiên của bạn XML? –

+0

Chúng tôi không chỉ định tùy chỉnh 'windowSharedElementExitTransition' Do đó, chúng tôi đang sử dụng các chủ đề mặc định. Các yếu tố được chia sẻ đã có kích thước cố định ở cả hai bố cục – Greeny

Trả lời

11

Có thể là bạn đang đánh một lỗi trong thư viện hiệu ứng chuyển tiếp rằng, đối với một số lý do, đã không được phát hiện cho đến sau khi L bị nhốt xuống.

Trong lỗi này, bạn phải chuyển đổi người nhập lại và chuyển đổi phần tử được chia sẻ lại. Chuyển đổi người nhập lại mặc định giống như chuyển tiếp thoát cho cả hai.

Nếu, trong quá trình chuyển trở lại, phần tử được chia sẻ sẽ được chuyển trở lại Hoạt động gọi trong khi các chế độ xem vẫn đang nhập, bạn sẽ thấy một trục trặc khi nó ngắt cuộc gọi trả lại. Với slide và các chuyển đổi phát nổ, bạn cũng sẽ thấy rằng lần sau khi bạn thoát ra, chúng sẽ bắt đầu từ nơi xảy ra hiện tượng nấc cục, do đó bạn sẽ có được một đôi wammy đẹp.

Vì vậy, bạn có một vài lựa chọn để làm việc xung quanh lỗi này cho đến khi MR1:

  • Đặt rõ ràng android:windowSharedElementReenterTransition-@null. Hầu hết thời gian bạn không cần quá trình chuyển đổi phần tử được chia sẻ lại vì Hoạt động được gọi sẽ đặt phần tử được chia sẻ ở đúng vị trí cho bạn.
  • Đừng sử dụng một quá trình chuyển đổi exit (thiết android:windowReenterTransition-@null)
  • Hãy chắc chắn rằng thời gian thực hiện Hoạt động kêu gọi của android:windowSharedElementReturnTransition là đủ lớn để các Hoạt động kêu gọi của windowReenterTransition kết thúc đầu tiên. Điều này có thể phức tạp vì nó có thể phụ thuộc vào trạng thái thiết bị - hoạt động gọi có thể đã bị xóa khỏi bộ nhớ và cần được khởi động lại.
  • Đặt android:windowAllowReturnTransitionOverlap thành false.
+1

Bạn có phải là kỹ sư phần mềm của Google không? Chỉ cần tự hỏi vì nó có vẻ như nó nhưng nó không nói như vậy trong hồ sơ StackOverflow của bạn. :) –

+0

Đặt 'android: windowAllowReturnTransitionOverlap' thành' false' hoạt động ngay bây giờ. Nhưng tôi cũng đã gửi báo cáo lỗi tại https://code.google.com/p/android/issues/detail?id=78393 –

+0

Đúng, tôi nên cập nhật hồ sơ đó. Bjorn, cảm ơn vì đã nộp lỗi. –

Các vấn đề liên quan